You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:31:07