首页 > 解决方案 > mysql:如何根据其他列对列进行排序

问题描述


我有一个通知表,想按 read_at 列和 created_at 列排序。

通知表

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);

结果表应为:

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-06-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 日期排序。

谢谢

标签: mysqldatesortingsql-order-bysql-null

解决方案


您可以按布尔表达式read_at IS NULL降序排序,这将返回所有位于顶部的行,然后按read_at降序(或按预期结果升序):nullcreated_at

ORDER BY read_at IS NULL DESC, created_at DESC -- or ASC ???

推荐阅读