將MySQL查詢結果按值排序的簡要教程_Mysql

來源:互聯網
上載者:User

MySQL查詢結果如何排序呢?這是很多人都提過的問題,下面就教您如何對MySQL查詢結果按某值排序,如果您感興趣的話,不妨一看。

之前有一個功能修改,要求MySQL查詢結果中:

id name * * *1 lucy ...3 lucy ...2 lily ...4 lucy ...

名字為lucy的優先排在前面,百思不得其解,可能有人會說簡單 union嘛 或者弄個暫存資料表什麼的,其實我也想過,但是本身SQL邏輯就很多了(上面只是簡例),再union的話或者暫存資料表可能繞很大的彎路,後來看到一篇文章嘗試著加入order by find_in_set(name,'lucy') ,結果 得到的結果為lucy全部在下面,隨即我改為order by find_in_set(name,'lucy') desc 實現結果為

id name * * *1 lucy ...3 lucy ...4 lucy ...2 lily ...

基本實現,可是又有點不確定的心情,查mysql文檔發現find_in_set文法

FIND_IN_SET(str,strlist)   

假如字串str 在由N 子鏈組成的字串列資料表strlist 中, 則傳回值的範圍在 1 到 N 之間 。一個字串列資料表就是一個由一些被『,』符號分開的自鏈組成的字串。如果第一個參數是一個常數字串,而第二個是type SET列,則   FIND_IN_SET() 函數被最佳化,使用位元計算。如果str不在strlist 或strlist 為空白字串,則傳回值為 0 。如任意一個參數為NULL,則傳回值為 NULL。 這個函數在第一個參數包含一個逗號(『,』)時將無法正常運行

mysql> SELECT FIND_IN_SET('b','a,b,c,d');      -> 2 

 
看了這個我估計結果為什麼要加desc 了 find_in_set返回的值是,當存在lucy的時候 返回他的位置,沒有的時候為0,空的時候null,所以排序為1,1,1,0,如果加在列上就為

id name FIND_IN_SET * *
1 lucy 1 ...3 lucy 1 ...2 lily 0 ...4 lucy 1...

表結構如下:

mysql> select * from test; 
+----+-------+ | id | name  | +----+-------+ |  1 | test1 | |  2 | test2 | |  3 | test3 | |  4 | test4 | |  5 | test5 | +----+-------+ 

執行以下SQL:

mysql> select * from test where id in(3,1,5); 
+----+-------+ | id | name  | +----+-------+ |  1 | test1 | |  3 | test3 | |  5 | test5 | +----+-------+ 3 rows in set (0.00 sec) 

這個select在mysql中得結果會自動按照id升序排列,

如果我們

select * from table where id IN (3,6,9,1,2,5,8,7);

這樣的情況取出來後,其實,id還是按1,2,3,4,5,6,7,8,9,排序的,但如果我們真要按IN裡面的順序排序怎麼辦?SQL能不能完成?是否需要取回來後再foreach一下?
其實可以這樣

select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);

出來的順序就是指定的順序了
關於這種排序的效率,
有文章指出:

FIELD(str,str1,str2,str3,…)Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found.

排序過程:把選出的記錄的 id 在 FIELD 列表中進行尋找,並返回位置,以位置作為排序依據。
這樣的用法,會導致 Using filesort,是效率很低的排序方式。除非資料變化頻率很低,或者有長時間的緩衝,否則不建議用這樣的方式排序。
作者建議在程式碼中自行排序。
但是也有人說這種排序不會出現什麼效能瓶頸
具體還是自己測試一下吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.