SQL工单表多条件排序:未答复按id升序置顶、已答复按id降序置底
解决方案
你可以通过在ORDER BY子句中使用条件判断实现分组自定义排序,以下是兼容绝大多数数据库(MySQL、PostgreSQL、SQL Server等)的标准SQL写法:
ORDER BY has_answer ASC, CASE WHEN has_answer = 0 THEN id END ASC, CASE WHEN has_answer = 1 THEN id END DESC
逻辑说明
- 第一层排序
has_answer ASC保证所有未答复工单(has_answer=0)始终排在已答复工单(has_answer=1)前面,两类数据完全分区不会穿插 - 第二层排序仅对未答复工单生效:
has_answer=1的行对应CASE返回值为NULL,在已经按has_answer分区的前提下,不会干扰未答复组的排序逻辑,未答复工单内部按id升序排列,更早创建的工单排在更靠前位置 - 第三层排序仅对已答复工单生效:
has_answer=0的行对应CASE返回值为NULL,不会干扰已答复组的排序逻辑,已答复工单内部按id降序排列
效果示例
假设存在以下测试数据:
| id | has_answer |
|---|---|
| 1 | 0 |
| 3 | 0 |
| 2 | 1 |
| 4 | 1 |
排序后输出的id顺序为1、3、4、2,完全匹配需求。
MySQL专属简化写法
如果你使用的是MySQL数据库,可以用IF函数简化语句:
ORDER BY has_answer ASC, IF(has_answer=0, id, 0) ASC, IF(has_answer=1, id, 0) DESC
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

