一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 將MySQL查詢結果按值排序的簡要教程

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

2020-05-26 15:27Andyuan1000 Mysql

這篇文章主要介紹了將MySQL查詢結果按值排序的簡要教程,不過同樣需要對結果進行檢查而決定是否使用order by等其他語句,需要的朋友可以參考下

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

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

?
1
2
3
4
5
6
7
8
9
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 實現結果為

?
1
2
3
4
5
6
7
8
9
id name * * *
 
1 lucy ...
 
3 lucy ...
 
4 lucy ...
 
2 lily ...

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

?
1
2
FIND_IN_SET(str,strlist) 

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

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

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

?
1
id name FIND_IN_SET * *
?
1
2
3
4
5
6
7
1 lucy 1 ...
 
3 lucy 1 ...
 
2 lily 0 ...
 
4 lucy 1...

表結構如下:

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

執行以下SQL:

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

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

如果我們

?
1
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一下?
其實可以這樣

?
1
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);

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

?
1
2
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,是效率很低的排序方式。除非數據變化頻率很低,或者有長時間的緩存,否則不建議用這樣的方式排序。
作者建議在程序代碼中自行排序。
但是也有人說這種排序不會出現什么性能瓶頸
具體還是自己測試一下吧。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 好紧好爽的午夜寂寞视频 | 91大神大战高跟丝袜美女 | 国产伊人久久 | 调教女高中生第3部分 | 好大好硬好深好爽想要小雪 | pron在线观看| 大乳一级一区二区三区 | 91se在线 | 狠狠香蕉 | 国产精品乱码高清在线观看 | 4444kk在线看片 | 操到翻白眼 | 免费观看在线观看 | 免费视频精品一区二区 | 1024国产高清精品推荐 | 久久精品国产色蜜蜜麻豆国语版 | bbwfreehd女厕所ved | 好猛好紧好硬使劲好大刺激视频 | www.四虎影| 男女全黄h全肉细节文 | 高h文3p双龙| 美女黑人做受xxxxxⅹ | 青苹果乐园影院免费观看完整版 | 国产成人精品视频一区二区不卡 | 精品国产午夜久久久久九九 | 暴露狂婷婷医院暴露tx | 无限观看社区在线视频 | 国产99精品成人免费视频 | 日本在线观看免费观看完整版 | 国产性色视频 | 秘书小说 | 欧美亚洲一区二区三区在线 | 偷拍综合网 | 免费刷10000名片赞网站 | 国产日产在线观看 | 精品网站一区二区三区网站 | 国产精品视频一区二区三区 | 国产51社区精品视频资源 | 禁欲天堂| 女人和男人搞基 | 日韩欧美成末人一区二区三区 |