MySQL order by基於不同字段條件排序

2021-09-29 16:29:37 字數 1654 閱讀 5711

從資料庫上查詢資料的時候,按要求排序,在某個欄位的不同值的基礎上再選擇不同的字段進行排序,具體描述如下:

1:首先有乙個基礎欄位status ,status 的取值分別為:1、2、3、4

2:先對status 進行排列,但是要求順序為:2、1、3、4(其實每個值都代表一種含義,簡單處理就是,將1和2代表的

含義調換位置,那就不用對這個欄位做處理直接公升序就ok了,這裡為了複雜一點,就這樣定義。)

3:如果status 為1,按follow_up_time做降序;

如果status 為3,按next_follow_up_time做降序;

如果status 為4,按final_follow_up_time做公升序;

具體實現如下,先貼出來sql,再進行解釋

select 

order by

case when status = 2 then 0 else 4 end asc,

status asc,

case when status = 1 then follow_up_time end desc,

case when status = 2

else follow_up_time end) end,

case when status = 3 then next_follow_up_time end desc,

case when status = 4 then final_follow_up_time end asc;

從order by 後面逐句開始:

如果status = 2,那就將status視為0,其他的視為4,進行一次公升序排序

case when status = 2 then 0 else 4 end asc,此時status = 2 已經視為 status = 0 了,那再對status 進行一次公升序,邏輯上status順序為:0、1、3、4, 則實際為:2、1、 3、4了。

status asc,已經對status排好序了,現在對不同值的status的資料進行排序。如果 status = 1,按follow_up_time做降序。

case when status = 1 then follow_up_time end desc,如果status = 3,按 next_follow_up_time 做降序

case when status = 3 then next_follow_up_time end desc,如果status = 4,按 final_follow_up_time 做公升序

case when status = 4 then final_follow_up_time end asc;

不合理的order by,會很大程度降低sql的效能,以下為摘抄的幾點建議:

1)order by的字段改到一種表、不要誇表(設計表結構時需注意這一點)

2)oeder by欄位建索引、多個欄位時建聯合索引(聯合索引的字段順序要與orser by中的字段順序一致)

3)order by中字段中聯合索引的所有欄位desc或asc要統一,否則索引不起作用

4)不要對text欄位或者clob欄位進行排序

end.

MySQL Order By索引優化

mysql order by索引優化 mysql可以直接使用索引來滿足乙個order by 子句而無需做額外的排序。儘管 order by 不是和索引的順序準確匹配,索引還是可以被用到。在一些情況下,mysql可以直接使用索引來滿足乙個 order by 或 group by 子句而無需做額外的排序...

mysql order by 排序技巧

首先我們新建表test,如下 create table test id int 11 not null auto increment,name varchar 255 default null,primary key id engine innodb auto increment 7 default...

MySQL order by工作機制

當使用order by對查詢結果進行排序時,mysql會給每個執行緒分配一塊兒記憶體sort buffer用於排序,在使用索引的情況下,整個的排序過程如下所述 1.初始化sort buffer,確定放入結果中所需的字段 2.從索引中找到第乙個滿足條件主鍵id 3.到主鍵id索引取出整行,取所需字段的...