最近遇上一个需求,数据有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;