從資料庫上查詢資料的時候,按要求排序,在某個欄位的不同值的基礎上再選擇不同的字段進行排序,具體描述如下:
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索引取出整行,取所需字段的...