2

我有一张评论表(对于这样的一些文章):

---------------------------------------------------------------
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引用id同一张表中的。当comment_idNULL时,这意味着该评论是评论(不是对另一个评论的回应,而是对文章本身的回应),但如果它不为空,则意味着该评论是评论(它是对文章中的另一条评论)。

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

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

但我不知道如何让父母评论(他们的孩子跟随它)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 显示以下信息:

服务器类型:MariaDB

服务器版本:10.1.40-MariaDB-cll-lve - MariaDB

服务器协议版本:10

cpsrvd 11.78.0.34

数据库客户端版本:libmysql - 5.1.73

PHP版本:7.2.7

phpMyAdmin:4.8.3

4

1 回答 1

1

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

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;
于 2019-07-21T09:36:38.327 回答