將MySQL查詢成果按值排序的扼要教程。本站提示廣大學習愛好者:(將MySQL查詢成果按值排序的扼要教程)文章只能為提供參考,不一定能成為您想要的結果。以下是將MySQL查詢成果按值排序的扼要教程正文
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,是效力很低的排序方法。除非數據變更頻率很低,或許有長時光的緩存,不然不建議用如許的方法排序。
作者建議在法式代碼中自行排序。
然則也有人說這類排序不會湧現甚麼機能瓶頸
詳細照樣本身測試一下吧。