MySQL如何按自定义状态优先级结合datetime升降序排序Event记录
MySQL多规则分组排序实现方案
你已经正确实现了第一级的分组优先级排序,只需要在ORDER BY后追加两级针对不同分组的时间排序规则即可,完整排序逻辑如下:
order by -- 第一级:按事件优先级分组排序,保证四类事件的先后顺序 CASE WHEN E.status = 'started' THEN 1 WHEN E.status = 'created' AND eventDateTime >= NOW() THEN 2 WHEN E.status = 'created' AND eventDateTime < NOW() THEN 3 WHEN E.status = 'finished' THEN 4 ELSE 5 END ASC, -- 第二级:对正在进行、即将发生的两类事件按时间升序排列 CASE WHEN E.status = 'started' THEN eventDateTime WHEN E.status = 'created' AND eventDateTime >= NOW() THEN eventDateTime ELSE NULL END ASC, -- 第三级:对超时未启动、已结束的两类事件按时间降序排列 CASE WHEN E.status = 'created' AND eventDateTime < NOW() THEN eventDateTime WHEN E.status = 'finished' THEN eventDateTime ELSE NULL END DESC;
逻辑说明
ORDER BY会按照书写顺序依次判断排序规则,上一级规则的返回值完全相同时,才会触发下一级规则判断,因此不会出现跨组排序混乱的问题- 不需要对应排序规则的分组在对应CASE中返回
NULL,NULL在排序中会被统一归为一类,不会影响目标分组的排序结果 - 建议将逻辑运算符
&&替换为标准SQL的AND,兼容性更强
内容的提问来源于stack exchange,提问作者MailingTester
相关产品推荐
相关产品推荐

