PHP根據規定的ids數據查詢出同樣順序的數據

我遇到的需求是固定死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;複製代碼

歡迎你們提出更好的方法來解決此問題

相關文章
相關標籤/搜索