在自引用中排序 table

Order by in a self referencing table

我有 table 条评论(对这样的文章):

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
0      NULL            0                time0
1      NULL            2                time1
2      0               0                time2
3      0               0                time3
4      NULL            1                time4
5      1               0                time5

comment_id 引用同一个 table 中的 id。当 comment_idNULL 时,这意味着此评论为 parent(它不是对另一个评论的回复,而是针对文章本身),但如果它不为空,则表示此评论是 child(它是对文章中另一条评论的回应)。

我正在使用的查询以每个 child 显示在其 parent 下的方式对结果进行排序。

SELECT *
FROM comments
ORDER BY
    COALESCE (comment_id, id) DESC, 
    (comment_id IS NULL) DESC, 
    likes_count DESC

但我不知道如何让 parent 评论(后面跟着他们的 children)最多 likes_count 出现在结果的第一位, likes_count DESC 似乎没有效果,因为结果总是按 id.

排序

查询返回的结果:

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
0      NULL            0                time0
2      0               0                time2
3      0               0                time3
1      NULL            2                time1
5      1               0                time5
4      NULL            1                time4

预期结果:

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
1      NULL            2                time1
5      1               0                time5
4      NULL            1                time4
0      NULL            0                time0   
2      0               0                time2
3      0               0                time3

phpMyAdmin 显示以下信息:

Server type: MariaDB

Server version: 10.1.40-MariaDB-cll-lve - MariaDB

Server Protocol version: 10

cpsrvd 11.78.0.34

Database client version:libmysql - 5.1.73

PHP version: 7.2.7

phpMyAdmin: 4.8.3

您可以尝试使用每个父子组的最大赞数添加排序级别:

SELECT *
FROM comments
ORDER BY
    MAX(likes_count) OVER (PARTITION BY COALESCE(comment_id, id)) DESC,
    COALESCE (comment_id, id) DESC, 
    comment_id IS NULL DESC;

如果您的数据库(无论实际是什么)不支持分析函数,那么我们可以使用连接执行相同的逻辑:

SELECT c1.*
FROM comments c1
INNER JOIN comments c2
    ON COALESCE(c1.comment_id, c1.id) = c2.id
ORDER BY
    c2.likes_count DESC,
    COALESCE (c1.comment_id, c1.id) DESC, 
    c1.comment_id IS NULL DESC;