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

 
SELECT
	* 
FROM
TABLE 
ORDER BY
CASE WHEN STATUS = 2 THEN 0 ELSE 2 END ASC,
	STATUS ASC,
CASE WHEN STATUS = 1 THEN end_time 
	END DESC,
CASE WHEN STATUS = 2 THEN ( CASE WHEN end_time IS NULL THEN appointment_time ELSE end_time END ) 
	END,
CASE WHEN STATUS = 3 THEN start_time 
	END DESC,
CASE WHEN STATUS = 4 THEN
	final_time 
	END ASC;
分析:
一、CASE WHEN STATUS = 2 THEN 0 ELSE 2 END ASC,
如果status = 2,那就将status视为0,其他的视为4,对status进行升序排序
二、STATUS ASC,
此时status = 2 已经视为 status = 0 了,那再对status 进行一次升序,逻辑上status顺序为:0、1、3、4, 则实际为:2、1、 3、4了。
三、CASE WHEN status = 1 THEN END_TIME END DESC,
已经对status排好序了,现在对不同值的status的数据进行排序。如果 status = 1,按END_TIME做降序。
四、CASE WHEN status = 2 THEN (CASE WHEN END_TIME IS NULL THEN START_TIME ELSE end_time END) END,
如果status = 2,按END_TIME做降序,若END_TIME为空,则按START_TIME降序,这里使用了双层case when,内层的case when 选择出到底用哪个字段排序。
五、CASE WHEN status = 3 THEN START_TIME END DESC,
如果status = 3,按 START_TIME 做降序
六、CASE WHEN status = 4 THEN FINAL_TIME END ASC;
如果status = 4,按 FINAL_TIME 做升序

你还可能用到:
SELECT 
id,
name,
Location,
     ,CASE
          WHEN  name='张三'
          THEN 100
          ELSE 1000
      END AS MYORDER1
      ,CASE
          WHEN  id='2'
          THEN 2
          ELSE 10
       END AS MYORDER2
  FROM table
 ORDER BY Location , MYORDER1,MYORDER2

--也可以在后面再加入case when 看需求
ok

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzmiaohao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值