在日常開發過程中,排序是經常用到的,有時候有這樣的需求:需要在查詢結果中根據某個欄位的具體值來排序
如下例子:
表名 tb
idname
ageclass
1iris
16a0
2iris
15a1
3seiki
15a2
4seiki
16a2
5xuding
16a1
6ben
16a0
7ben
16a3
8xuding
16a3
上述這張表,假如我們想按照』seiki』,『iris』,來排序。也就是name=『seiki』,『iris』,'ben』的來排序,這是要怎麼實現呢?這就要field()函式自定義排序。
語法
field(str,str1,str2,str3,...)
含義
1、field()函式是將其應用到order by中的;
2、str指的是欄位名字,str與str1、str2、str3…比較;
3、欄位str按照字串str1、str2、str3的順序返回查詢到的結果集;
4、如果表中str字段值不存在於str1、str2、str3中的記錄,放在結果集最前面返回。
下面我們就使用field()函式對其按照自定義的的方式進行排序
使用
mysql>select * from tb where order by field(name,'seiki','iris','ben');
mysql中預設的排序為公升序,既asc,如果想要降序就需要使用desc。
使用上述sql查詢的結果為:
idname
ageclass
5xuding
16a1
8xuding
16a3
3seiki
15a2
4seiki
16a2
1iris
16a0
2iris
15a1
6ben
16a0
7ben
16a3
可以發現,我們得到的結果就是按照條件 『seiki』,『iris』,『ben』 進行排序後得到了。
應用層面的思考
相容性本文提到的 field 函式,畢竟只是 mysql 資料庫內建提供的一種函式,除非你非常明確你的專案就是只用 mysql 資料庫,否則,你的 sql **在未來遷移到其他資料庫的過程中就會遇到語法相容性問題(只是 postgresql 資料庫不支援 field)。
效能問題
我們都知道,資料庫在進行 order by 排序的時候,除非它是按照某個已經存在索引的鍵的值進行排序,否則資料庫則需要通過計算 order by 中表示式的值並且按照查詢結果建立新的臨時表,這個過程會帶來額外的時間開銷跟記憶體開銷,對資料庫本身就是一種效能負擔。這樣的方式在單一資料庫多個資料庫客戶端連線的時候,可能對資料庫造成太大負擔。
與應用層**的結合
儘管使用 field 函式可能帶來相容性以及效能方面的隱患,但是 field 的使用並非全是有損之處。
比如在與 ruby 的 active_record 結合時,這種通過資料庫直接完成排序等 sql 語句可以方便我們構建 activerecord::relation 物件,因為我們不再需要先將查詢結果集從記憶體中轉為陣列排序,再進行二次查詢,可以幫助我們減少 n+1 查詢問題,後者也是常見的影響資料庫伺服器效能的現象之一。除此之外,這樣的寫法也可以有效地幫助我們簡化**,保持**簡潔。
但是在不需要對資料進行二次查詢或者查詢資料量太大的情況下,我反而建議可以通過 ruby 的 array#sort_by 方法對資料進行排序,這樣的話,排序的任務就轉移給了客戶端**,排序任務的壓力就自然分散,減輕了伺服器端的壓力。
總結field 函式結合 order by 可以幫助我們將查詢結果集按照引數列表順序返回;
field 函式結合 order by 的方式可以幫助我們在資料庫層面完成排序,簡化了業務**邏輯;
field 函式結合 order by 可能帶來 sql 相容性以及效能方面的問題;
在確認專案資料庫不大可能為 mysql 之外的資料庫的前提下,查詢資料量少或者需要保持業務**簡潔的場景下,我建議可以採用 field 函式排序;而在資料量龐大的情況下,或者不大可能出現大量 n+1 查詢的情況下,我建議可以採用先在資料庫中查詢資料集(只查詢 in 條件,不排序)再到記憶體中通過業務**排序(比如 ruby 的 array#sort_by)的方式。
mysql自定義函式field
mysql可以通過field 函式自定義排序,格式 field value,str1,str2,str3,str4 value與str1 str2 str3 str4比較,返回1 2 3 4,如遇到null或者不在列表中的資料則返回0.這個函式好像oracle中沒有專門提供 也可能是我沒有用到 不過...
mysql 中的field 排序函式
field 函式 是將查詢的結果集按照指定順序排序。格式 field str,str1,str2,str3,什麼時候用 想讓某幾個特定的字段值放在最後,用field 函式。解釋 str是欄位名字,字串str1,str2,str3等等,是該字段的值。函式意思 匹配到str1,將其放到結果集最後返回。詳...
TP3 2使用FIELD 函式排序
開發中,遇到的要求,查詢資料時,按照資料的狀態 status 排序 status 的值可以為1,2,3,4,5 但是要求並不是簡單的正序,倒序,而是需要把資料按照2,1,5,3,4來排序 同事推薦使用field函式 使用方法 相當於order by field status,2,1,5,3,4 我在...