记录mysql
中order by
结合 case when
实现多条件排序.
模拟需求描述
查询出学生列表, 根据 学生年龄
进行正序排序
, 但是10岁以下
的学生 要按照 倒叙排序
.
表: student
需求分析和实现
需求中给出了两个条件, 一个是根据学生年龄正序
, 一个是 10岁以下的倒叙
1. 根据学生年龄正序
-- 通过 order by 年龄 asc 即可实现
SELECT id, name, age, sex
FROM student
order by age asc;
效果图如下:
2. 10岁以下的倒叙
-- order by 中加入条件 ,年龄<10的数据进行倒叙排列, 其他的则根据年龄正序
SELECT id, name, age, sex
FROM student
order by
case when age < 10 then age end desc,
age asc;
效果图如下:
注: 如果 case when end 后有其他的排序字段,那些字段的排序优先级会比 case when end 低一点, 反之依然
真实场景
最后说下这几天在公司遇到的一个需求: 事项列表排序在原有的基础上添加上一个条件:“已结束”状态的事项到期自动去除排序权重,企业端展示按事项状态优先级排序。
原有的排序规则是:
自定义权重 > 市本级的数据 (进行中 > 长期 > 未开始 > 已结束 > ) > 非市本级的数据(进行中 > 长期 > 未开始 > 已结束 > )
新的规则等于是要在自定义权重的事项结束后, 让他不要按照自定义权重来排序 ,或者是将权重去掉, 我是做法式在排序的时候如果事项已结束则忽略掉自定义权重