將MySQL查詢結(jié)果按值排序的簡要教程
MySQL查詢結(jié)果如何排序呢?這是很多人都提過的問題,下面就教您如何對MySQL查詢結(jié)果按某值排序,如果您感興趣的話,不妨一看。
之前有一個功能修改,要求MySQL查詢結(jié)果中:
id name * * * 1 lucy ... 3 lucy ... 2 lily ... 4 lucy ...
名字為lucy的優(yōu)先排在前面,百思不得其解,可能有人會說簡單 union嘛 或者弄個臨時表什么的,其實我也想過,但是本身SQL邏輯就很多了(上面只是簡例),再union的話或者臨時表可能繞很大的彎路,后來看到一篇文章嘗試著加入order by find_in_set(name,'lucy') ,結(jié)果 得到的結(jié)果為lucy全部在下面,隨即我改為order by find_in_set(name,'lucy') desc 實現(xiàn)結(jié)果為
id name * * * 1 lucy ... 3 lucy ... 4 lucy ... 2 lily ...
基本實現(xiàn),可是又有點不確定的心情,查mysql文檔發(fā)現(xiàn)find_in_set語法
FIND_IN_SET(str,strlist)
假如字符串str 在由N 子鏈組成的字符串列數(shù)據(jù)表strlist 中, 則返回值的范圍在 1 到 N 之間 。一個字符串列數(shù)據(jù)表就是一個由一些被『,』符號分開的自鏈組成的字符串。如果第一個參數(shù)是一個常數(shù)字符串,而第二個是type SET列,則 FIND_IN_SET() 函數(shù)被優(yōu)化,使用比特計算。如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數(shù)為NULL,則返回值為 NULL。 這個函數(shù)在第一個參數(shù)包含一個逗號(『,』)時將無法正常運行
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
看了這個我估計結(jié)果為什么要加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...
表結(jié)構(gòu)如下:
mysql> select * from test;
+----+-------+ | id | name | +----+-------+ | 1 | test1 | | 2 | test2 | | 3 | test3 | | 4 | test4 | | 5 | test5 | +----+-------+
執(zhí)行以下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中得結(jié)果會自動按照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);
出來的順序就是指定的順序了
關(guān)于這種排序的效率,
有文章指出:
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 列表中進行查找,并返回位置,以位置作為排序依據(jù)。
這樣的用法,會導致 Using filesort,是效率很低的排序方式。除非數(shù)據(jù)變化頻率很低,或者有長時間的緩存,否則不建議用這樣的方式排序。
作者建議在程序代碼中自行排序。
但是也有人說這種排序不會出現(xiàn)什么性能瓶頸
具體還是自己測試一下吧。
相關(guān)文章
MySQL如何查詢數(shù)據(jù)庫中所有表名及注釋等信息
這篇文章主要介紹了MySQL如何查詢數(shù)據(jù)庫中所有表名及注釋等信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10mysql err錯誤提示You need to use --log-
今天在檢查mysql服務器錯誤日志的時候發(fā)現(xiàn)You need to use --log-bin to make --binlog-format work,通過如下方法解決了特分享一下2023-06-06