mysql:如何根据其他列对列进行排序

问题描述


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

通知

id read_at created_at
1 21-jun-2021 12:56:12
2 22-jun-2021 13:12:43
3 24-jun-2021 19:43:42 23-jun-2021 16:34:45
4 23-jun-2021 17:00:03 23-jun-2021 16:40:22
5 24-jun-2021 11:41:32
6 24-jun-2021 21:12:12 24-jun-2021 19:45:22
7 25-jun-2021 03:14:08 25-jun-2021 03:12:57
8 25-jun-2021 09:59:22
9 25-jun-2021 12:41:40 25-jun-2021 12:41:09
10 26-jun-2021 01:59:59 25-jun-2021 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 21-jun-2021 12:56:12
2 22-jun-2021 13:12:43
5 24-jun-2021 11:41:32
8 25-jun-2021 09:59:22
3 25-jun-2021 19:43:42 23-jun-2021 16:34:45
4 27-jun-2021 17:00:03 23-jun-2021 16:40:22
6 24-jun-2021 21:12:12 24-jun-2021 19:45:22
7 29-jun-2021 03:14:08 25-jun-2021 03:12:57
9 25-jun-2021 12:41:40 25-jun-2021 12:41:09
10 26-jun-2021 01:59:59 25-jun-2021 20:09:02

我无法非常清楚地解释这一点。

我希望按 created_at 日期排序在顶部的未读通知
如果已阅读通知,则剩余部分应按 created_at 日期排序。

谢谢

解决方法

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

created_at
,

我相信这应该可以解决您的问题。

现在无法测试。

从通知顺序中选择 id,read_at,created_at 当 read_at 为 null 然后 1 else 0 end desc,created_at desc