mysql (mariadb) 按两列排序不起作用
mysql (mariadb) ordering by two columns does not work
我正在尝试通过按文本和时间戳排序来获得答案,首先必须是 text = null 的答案,接下来是 ts 排序的非 null 文本,但它不起作用:
SELECT * FROM answers WHERE user_id = 1279942 ORDER BY text, ts desc;
+----------+---------+-------------+------------+-------------------------------+--------+
| id | user_id | question_id | ts | text | is_new |
+----------+---------+-------------+------------+-------------------------------+--------+
| 81187563 | 1279942 | 30918210 | 1487186969 | NULL | 0 |
| 81187560 | 1279942 | 30918209 | 1487117018 | NULL | 0 |
| 81187559 | 1279942 | 30918208 | 1487116399 | NULL | 0 |
| 81187557 | 1279942 | 30918205 | 1487024673 | Jg jg jg | 1 |
| 81187555 | 1279942 | 30918205 | 1487022656 | Jg jg jg | 1 |
| 7 | 1279942 | 30915697 | 1397915529 | lf | 0 |
| 81187535 | 1279942 | 30915687 | 1397047472 | да | 0 |
| 8 | 1279942 | 30915697 | 1397990298 | да все ок | 0 |
| 81187543 | 1279942 | 30915688 | 1397047582 | Да ничего | 0 |
| 81187561 | 1279942 | 30918206 | 1487186497 | Леха, все супер! | 1 |
| 81187556 | 1279942 | 30918205 | 1487022667 | Оп оп | 1 |
| 81187558 | 1279942 | 30918207 | 1487186977 | Последний ответ | 1 |
| 81187562 | 1279942 | 30917194 | 1487186733 | ТЕСТОВЫЙ ОТВЕТ | 1 |
| 1537 | 1279942 | 30917195 | 1413380315 | фыв | 0 |
| 81187547 | 1279942 | 30915691 | 1397048820 | щл | 0 |
+----------+---------+-------------+------------+-------------------------------+--------+
15 rows in set (0.00 sec)
第4行一定是id为81187558的答案,谁知道是什么原因造成的?
未经测试,但您可能会使用类似这样的东西来按照您想要的方式订购:
SELECT * FROM answers WHERE user_id = 1279942
ORDER BY ISNULL(text) DESC, ts DESC;
请注意,如果值不为空,则 ISNULL()
returns 0
,如果为空,则为 1
。因此,通过首先按降序对其进行排序,我们将所有 text
是 NULL
的记录放在顶部。这将创建两个共享 ISNULL
值的存储桶。所以余数将仅按 ts
排序,因为 ISNULL
都是 0
。
您最初的方法首先按 text
排序,然后对于共享 text
值的每个桶,它在内部按 ts
排序。
我正在尝试通过按文本和时间戳排序来获得答案,首先必须是 text = null 的答案,接下来是 ts 排序的非 null 文本,但它不起作用:
SELECT * FROM answers WHERE user_id = 1279942 ORDER BY text, ts desc;
+----------+---------+-------------+------------+-------------------------------+--------+
| id | user_id | question_id | ts | text | is_new |
+----------+---------+-------------+------------+-------------------------------+--------+
| 81187563 | 1279942 | 30918210 | 1487186969 | NULL | 0 |
| 81187560 | 1279942 | 30918209 | 1487117018 | NULL | 0 |
| 81187559 | 1279942 | 30918208 | 1487116399 | NULL | 0 |
| 81187557 | 1279942 | 30918205 | 1487024673 | Jg jg jg | 1 |
| 81187555 | 1279942 | 30918205 | 1487022656 | Jg jg jg | 1 |
| 7 | 1279942 | 30915697 | 1397915529 | lf | 0 |
| 81187535 | 1279942 | 30915687 | 1397047472 | да | 0 |
| 8 | 1279942 | 30915697 | 1397990298 | да все ок | 0 |
| 81187543 | 1279942 | 30915688 | 1397047582 | Да ничего | 0 |
| 81187561 | 1279942 | 30918206 | 1487186497 | Леха, все супер! | 1 |
| 81187556 | 1279942 | 30918205 | 1487022667 | Оп оп | 1 |
| 81187558 | 1279942 | 30918207 | 1487186977 | Последний ответ | 1 |
| 81187562 | 1279942 | 30917194 | 1487186733 | ТЕСТОВЫЙ ОТВЕТ | 1 |
| 1537 | 1279942 | 30917195 | 1413380315 | фыв | 0 |
| 81187547 | 1279942 | 30915691 | 1397048820 | щл | 0 |
+----------+---------+-------------+------------+-------------------------------+--------+
15 rows in set (0.00 sec)
第4行一定是id为81187558的答案,谁知道是什么原因造成的?
未经测试,但您可能会使用类似这样的东西来按照您想要的方式订购:
SELECT * FROM answers WHERE user_id = 1279942
ORDER BY ISNULL(text) DESC, ts DESC;
请注意,如果值不为空,则 ISNULL()
returns 0
,如果为空,则为 1
。因此,通过首先按降序对其进行排序,我们将所有 text
是 NULL
的记录放在顶部。这将创建两个共享 ISNULL
值的存储桶。所以余数将仅按 ts
排序,因为 ISNULL
都是 0
。
您最初的方法首先按 text
排序,然后对于共享 text
值的每个桶,它在内部按 ts
排序。