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_atnull 的行排在顶部,然后 [=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