MySQL:基于布尔值(TRUE优先)与timestamp的排序问题
SQL排序问题:按Active分组后统一排序timestamp
原始数据表
| Id | Active | timestamp |
|---|---|---|
| 1 | TRUE | 23-09-10 |
| 2 | NULL | 23-09-11 |
| 3 | FALSE | 23-09-12 |
| 4 | TRUE | 23-09-15 |
| 5 | NULL | 23-09-16 |
排序需求
- 优先展示
Active = TRUE的记录,这部分按timestamp升序排列 - 再展示
Active = FALSE或Active IS NULL的记录,这部分整体按timestamp升序排列
尝试过的写法
我第一次用CASE语句处理ORDER BY,试了两种写法:
ORDER BY (case when active then 0 else 1 end), timestamp;
或者(存在字段名拼写错误):
ORDER BY actif IS TRUE DESC, timestamp;
当前得到的排序结果
| Id | Active | timestamp |
|---|---|---|
| 1 | TRUE | 23-09-10 |
| 4 | TRUE | 23-09-15 |
| 3 | FALSE | 23-09-12 |
| 2 | NULL | 23-09-11 |
| 5 | NULL | 23-09-16 |
这个结果中,FALSE和NULL的记录没有按timestamp统一排序,不符合需求。
期望的排序结果
| Id | Active | timestamp |
|---|---|---|
| 1 | TRUE | 23-09-10 |
| 4 | TRUE | 23-09-15 |
| 2 | NULL | 23-09-11 |
| 3 | FALSE | 23-09-12 |
| 5 | NULL | 23-09-16 |
解决方案
问题出在要么字段名拼写错误,要么数据库在分组后额外按Active字段排序。以下两种写法可以正确实现需求:
方法1:明确分组的CASE语句
ORDER BY CASE WHEN Active = TRUE THEN 0 ELSE 1 -- 将FALSE和NULL归为同一组 END, timestamp;
方法2:简洁的IS TRUE判断(修正拼写)
把之前的actif改为正确的字段名active,这个写法更简洁:
ORDER BY Active IS TRUE DESC, timestamp;
这两种写法都会先将Active = TRUE的记录按timestamp升序排列,再把FALSE和NULL的记录整体按timestamp升序排列,得到你期望的结果。
另外请确认timestamp字段是日期类型,或者是YY-MM-DD格式的字符串(保证字符串排序和日期顺序一致),避免排序异常。
内容的提问来源于stack exchange,提问作者zebu14
相关产品推荐
相关产品推荐

