今天遇到一個問題就是有個查詢需要按照指定的ID 值順序來返回結果集其實也可以放在程式中做排序但是突然想看看能不能直接使用Mysql直接查詢返回就找了下還真有輔助函數實作。
Field()函數
Mysql中有提供一個函數Field() 可以依照我們給定的順序來自訂排序
#範例:
假設現在有一張城市資訊表叫regions 有主鍵id 和一個名稱屬性name, 現在想查詢ID 為2、3、1 並依照這個順序回傳
<p>select id, name from regions;#id name<br> 1 北京 2 上海 3 深圳<br></p>
使用field()
<p>select id, name from regions order by field(id, 2, 3, 1);#id name<br> 2 上海 3 深圳 1 北京<br></p>
這樣就達到按自定義順序排序的目的了
#效能
<p>mysql> explain select id from regions order by field(id, 2, 3, 1);+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+|id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra ||-- | ----------- | ------- | ---- | ------------- | --- | ------- | --- | ---- | ----------------------------| |1 | SIMPLE | regions | index| NULL | id | 4 | NULL| 3 | Using index; Using filesort |+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+<br></p>
因為我們在使用Order By Field 的時候指定了是按照主鍵ID 來排序主鍵有個Primary 的主鍵索引他會使用id來尋找條件等於2,3,1 的記錄所以可以看到在Extra 中有Using index 如果你換個別的沒有索引的字段這裡就不會有它了。而Order By 子句不能使用該索引只能使用Filesort 排序也就是Extra 中有Using filesort 的原因
大概過程如下:
##從id索引的第一個葉子節點出發,依序掃描所有葉子節點根據每個葉子節點記錄的主鍵id去主鍵索引(叢集索引))找到真實的行資料
判斷行資料是否滿足id = 2、 3、1 條件,若滿足,則取出並返回
這樣的用法,會導致 Using filesort(當然使用了Filesort 並不一定就會慢 有時候比不是用要更快),是效率很低的排序方式。
總結
Field() 函數可以幫助我們在資料庫層直接完成一些需要的排序可以簡化業務程式碼,但是同時它還會有相容性和效能問題建議可以用在資料變化頻率低或有長時間快取的地方,而在資料量很大的情況下可以採用資料庫查詢出資料在到程式中來排序吧推薦學習:《mysql影片教學》 作用配備「#
以上是一文講解Mysql怎麼依照ID值的順序回傳結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!