mysql排序field,case when

最近遇上一个需求,数据有state,create_time,update_time三个字段,当state=1时,这个数据放在其他state状态数据的前面,且按create_time倒序排序。当为其他state时数据按update_time倒序排序。
这种时候简单的多列排序肯定行不通了。首先是第一个需求,需要把state=1的数据放在最前面,这里就用到了FIELD方法。(其实这里也可用if的方法,看个人选择吧)

 order by field(字段1, 值1,值2, 值3) desc/asc, 字段2 desc/asc; 

field函数主要起一个筛选作用,第一个值传字段,后面的是匹配的值,类似一个In查询,将符合条件的数据单独放取出来并默认按照id顺序排序。括号后面的字段是让你选择把这批数据放到最前排还是最后面的,asc是放到最后面,desc是放到最前面。后面的字段2就是其他数据的排序规则。

所以按照我现在的需求应该这样写

order by field(state,1)desc,push_time desc

但是这样写的话并不满足按照create_time倒序排序的要求,所以这里还要用上case when。

CASE input_expression
WHEN when_expression THEN
    result_expression [...n ] [
ELSE
    else_result_expression
END

case,when简单来说就是当数据满足case条件时就用一种排序方法,否则就用另外一种排序方法,且这里的case可以有多个,也就可以细分出很多选项,就是switch的概念。
这里我们的要求是当state = 1是按照create_time倒序排序,其他的state按照push_time倒序排序。
最终排序的写法就是

order by field(state,1)desc,
CASE when state = 1 THEN create_time else push_time end desc;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值