我遇到的需求是固定死top10的數據,前端寫死能夠輕鬆實現,爲了節約維護成本,我打算在利用後臺返回給前端數據。前端
可是由於這排名是設置好的,因此要按照規定的順序遍歷出來sql
具體數據爲$usIds,在下方有給出,直接whereIn查詢出來的結果則是按照id desc返回的,不太符合咱們項目的要求數據庫
主要是讓數組裏id的順序返回,因此通過如下方法實現了此功能,但並非很完美數組
暫時就想到了這幾種,若是後續還有更好的解決方案,此文章還會繼續更新bash
小白親筆,大佬勿噴。函數
公共代碼部分優化
$usIds = ['65', '61', '78', '18', '84', '35', '79', '43', '58', '47'];
$newUsSchools = [];複製代碼
最不成熟(也就是最菜)的方法ui
將這些id存在一個數組裏,而後遍歷進行查詢,這樣對數據庫的壓力挺大的,耗費時間。spa
foreach ($usIds as $usId) {
$newUsSchools[] = M('School')->find($usId);
}
var_dump($newUsSchools);die;複製代碼
在時間上會浪費不少時間code
$usSchools = M('School')->where(['id'=>['in', $usIds]])->field(['id','name'])->select();
foreach ($usIds as $usId) {
foreach ($usSchools as $value) {
if ($usId == $value['id']) {
$newUsSchools[] = $value;
}
}
}
var_dump($newUsSchools);die;複製代碼
需PHP版本5.5+以上使用
$usSchools = M('School')->where(['id'=>['in', $usIds]])->field(['id','name'])->select();
$usSchools = array_column($usSchools,null,'id'); //PHP版本5.5+
foreach ($usIds as $usId) {
array_push($newUsSchools, $usSchools[$usId]);
}
var_dump($newUsSchools);die;複製代碼
使用原生sql來實現排序 find_in_str
(表很大的狀況)這樣的sql效率可能會很低,建議查詢出來後用代碼來排序
MySQL手冊中find_in_set函數的語法:
FIND_IN_SET(str,strlist)str 要查詢的字符串
strlist 字段名 參數以」,」分隔 如 (1,2,6,8)
查詢字段(strlist)中包含(str)的結果,返回結果爲null或記錄假如字符串str在由N個子鏈組成的字符串列表strlist 中,則返回值的範圍在 1 到 N 之間。 一個字符串列表就是一個由一些被 ‘,’ 符號分開的子鏈組成的字符串。若是第一個參數是一個常數字符串,而第二個是type SET列,則FIND_IN_SET() 函數被優化,使用比特計算。 若是str不在strlist 或strlist 爲空字符串,則返回值爲 0 。如任意一個參數爲NULL,則返回值爲 NULL。這個函數在第一個參數包含一個逗號(‘,’)時將沒法正常運行。
$newUsSchools = M('School')->query("SELECT * FROM kona_school WHERE id IN(65,61,78,18,84,35,79,43,58,47) ORDER BY FIND_IN_SET(id,'65,61,78,18,84,35,79,43,58,47')");
var_dump($newUsSchools);die;複製代碼