mysql : 如何根据其他列对列进行排序
mysql : How to sort columns based on other columns
我有一个通知 table,想按 read_at 列和 created_at 列排序。
通知Table
id
read_at
created_at
1
无
2021 年 6 月 21 日 12:56:12
2
无
2021 年 6 月 22 日 13:12:43
3
2021 年 6 月 24 日 19:43:42
2021 年 6 月 23 日 16:34:45
4
2021 年 6 月 23 日 17:00:03
2021 年 6 月 23 日 16:40:22
5
无
2021 年 6 月 24 日 11:41:32
6
2021 年 6 月 24 日 21:12:12
2021 年 6 月 24 日 19:45:22
7
2021 年 6 月 25 日 03:14:08
2021 年 6 月 25 日 03:12:57
8
无
2021 年 6 月 25 日 09:59:22
9
2021 年 6 月 25 日 12:41:40
2021 年 6 月 25 日 12:41:09
10
2021 年 6 月 26 日 01:59:59
2021 年 6 月 25 日 20:09:02
我想要的是这样的:\
sort (if read_at is null then read_at desc, created_at desc else created_at desc);
结果 table 应该是:
id
read_at
created_at
1
无
2021 年 6 月 21 日 12:56:12
2
无
2021 年 6 月 22 日 13:12:43
5
无
2021 年 6 月 24 日 11:41:32
8
无
2021 年 6 月 25 日 09:59:22
3
2021 年 6 月 25 日 19:43:42
2021 年 6 月 23 日 16:34:45
4
2021 年 6 月 27 日 17:00:03
2021 年 6 月 23 日 16:40:22
6
2021 年 6 月 24 日 21:12:12
2021 年 6 月 24 日 19:45:22
7
2021 年 6 月 29 日 03:14:08
2021 年 6 月 25 日 03:12:57
9
2021 年 6 月 25 日 12:41:40
2021 年 6 月 25 日 12:41:09
10
2021 年 6 月 26 日 01:59:59
2021 年 6 月 25 日 20:09:02
这个我解释不清楚
我希望未读通知按 created_at 日期排序在顶部。
如果已阅读通知,则其余应按 created_at 日期排序。
谢谢
您可以按布尔表达式 read_at IS NULL
降序排序,这将 return 所有带有 read_at
且 null
的行排在顶部,然后 [=14] =] 降序(或像您预期的结果一样升序):
ORDER BY read_at IS NULL DESC, created_at DESC -- or ASC ???
我相信这应该可以解决您的问题。
现在无法测试。
select id, read_at, created_at from notifications order by case when read_at is null then 1 else 0 end desc, created_at desc
我有一个通知 table,想按 read_at 列和 created_at 列排序。
通知Table
id | read_at | created_at |
---|---|---|
1 | 无 | 2021 年 6 月 21 日 12:56:12 |
2 | 无 | 2021 年 6 月 22 日 13:12:43 |
3 | 2021 年 6 月 24 日 19:43:42 | 2021 年 6 月 23 日 16:34:45 |
4 | 2021 年 6 月 23 日 17:00:03 | 2021 年 6 月 23 日 16:40:22 |
5 | 无 | 2021 年 6 月 24 日 11:41:32 |
6 | 2021 年 6 月 24 日 21:12:12 | 2021 年 6 月 24 日 19:45:22 |
7 | 2021 年 6 月 25 日 03:14:08 | 2021 年 6 月 25 日 03:12:57 |
8 | 无 | 2021 年 6 月 25 日 09:59:22 |
9 | 2021 年 6 月 25 日 12:41:40 | 2021 年 6 月 25 日 12:41:09 |
10 | 2021 年 6 月 26 日 01:59:59 | 2021 年 6 月 25 日 20:09:02 |
我想要的是这样的:\
sort (if read_at is null then read_at desc, created_at desc else created_at desc);
结果 table 应该是:
id | read_at | created_at |
---|---|---|
1 | 无 | 2021 年 6 月 21 日 12:56:12 |
2 | 无 | 2021 年 6 月 22 日 13:12:43 |
5 | 无 | 2021 年 6 月 24 日 11:41:32 |
8 | 无 | 2021 年 6 月 25 日 09:59:22 |
3 | 2021 年 6 月 25 日 19:43:42 | 2021 年 6 月 23 日 16:34:45 |
4 | 2021 年 6 月 27 日 17:00:03 | 2021 年 6 月 23 日 16:40:22 |
6 | 2021 年 6 月 24 日 21:12:12 | 2021 年 6 月 24 日 19:45:22 |
7 | 2021 年 6 月 29 日 03:14:08 | 2021 年 6 月 25 日 03:12:57 |
9 | 2021 年 6 月 25 日 12:41:40 | 2021 年 6 月 25 日 12:41:09 |
10 | 2021 年 6 月 26 日 01:59:59 | 2021 年 6 月 25 日 20:09:02 |
这个我解释不清楚
我希望未读通知按 created_at 日期排序在顶部。
如果已阅读通知,则其余应按 created_at 日期排序。
谢谢
您可以按布尔表达式 read_at IS NULL
降序排序,这将 return 所有带有 read_at
且 null
的行排在顶部,然后 [=14] =] 降序(或像您预期的结果一样升序):
ORDER BY read_at IS NULL DESC, created_at DESC -- or ASC ???
我相信这应该可以解决您的问题。
现在无法测试。
select id, read_at, created_at from notifications order by case when read_at is null then 1 else 0 end desc, created_at desc