MySQL查询:如何将已完成工单后置并按创建日期降序排列
解决方案:将已完成工单排在结果集末尾并按创建日期排序
你可以通过在ORDER BY子句中使用条件权重排序实现需求,无需拆分两次查询,以下是两种可行方案:
方案一:通用CASE表达式(适配所有SQL数据库)
用CASE给不同状态的工单分配排序优先级,非COMPLETED工单权重为0,COMPLETED工单权重为1,按权重升序即可让已完成工单沉到底部,再按创建日期降序排列:
SELECT * FROM tickets ORDER BY CASE WHEN `TicketStatus` = 'COMPLETED' THEN 1 ELSE 0 END ASC, `DateCreated` DESC;
如果你的工单状态存在大小写不一致的情况(比如实际存储为Completed或completed),可以用LOWER()函数统一匹配:
SELECT * FROM tickets ORDER BY CASE WHEN LOWER(`TicketStatus`) = 'completed' THEN 1 ELSE 0 END ASC, `DateCreated` DESC;
方案二:利用布尔值排序(部分数据库适用)
在MySQL、PostgreSQL等支持布尔值排序的数据库中,你可以直接调整排序方向来修正之前的尝试:
SELECT * FROM tickets ORDER BY `TicketStatus` = 'COMPLETED' DESC, `DateCreated` DESC;
解释:TicketStatus='COMPLETED'会返回1(真)或0(假),按降序排序时,0(非已完成)会排在1(已完成)之前,同时保持每组内按创建日期从新到旧排列。
为什么你之前的写法无效?
你之前的语句ORDER BY TicketStatus='Completed', DateCreated DESC默认是升序排序,理论上0(非已完成)应该排在1(已完成)前面,但可能是以下原因导致失效:
- 状态值大小写不匹配:比如实际存储的是
COMPLETED,但你写的是Completed - 部分数据库对布尔表达式的排序逻辑有差异,导致结果不符合预期
内容的提问来源于stack exchange,提问作者techtheatre
相关产品推荐
相关产品推荐

