2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > MySQL order by基于不同字段条件排序

MySQL order by基于不同字段条件排序

时间:2019-10-08 06:41:45

相关推荐

MySQL order by基于不同字段条件排序

MySQL order by基于不同字段条件排序

从数据库上查询数据的时候,按要求排序,在某个字段的不同值的基础上再选择不同的字段进行排序,具体描述如下:

1:首先有一个基础字段status ,status 的取值分别为:1、2、3、42:先对status 进行排列,但是要求顺序为:2、1、3、4(其实每个值都代表一种含义,简单处理就是,将1和2代表的含义调换位置,那就不用对这个字段做处理直接升序就ok了,这里为了复杂一点,就这样定义。)3:如果status 为1,按follow_up_time做降序;如果status 为2,按follow_up_time做降序,若follow_up_time为空,则按appointment_time降序;如果status 为3,按next_follow_up_time做降序;如果status 为4,按final_follow_up_time做升序;

具体实现如下,先贴出来SQL,再进行解释

SELECT *FROM t_user_appointmentORDER BYCASE 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 THEN (CASE WHEN follow_up_time IS NULL THEN appointment_time 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 = 2,按follow_up_time做降序,若follow_up_time为空,则按appointment_time降序,这里使用了双层case when,内层的case when 选择出到底用哪个字段排序。

CASE WHEN status = 2 THEN (CASE WHEN follow_up_time IS NULL THEN appointment_time ELSE follow_up_time END) END,如果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.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。