Sql 自引用表中的Order by

Sql 自引用表中的Order by,sql,mariadb,sql-order-by,mariadb-10.1,Sql,Mariadb,Sql Order By,Mariadb 10.1,我有一个评论表(对像这样的文章): comment\u id引用的是同一表格中的id。当comment\u id为NULL时,这意味着此注释是父项(它不是对另一条注释的响应,而是对文章本身的响应),但如果它不是NULL,则表示此注释是子项(它是对文章中另一条注释的响应) 我使用的查询以一种方式对结果进行排序,其中每个子项都显示在其父项下 SELECT * FROM comments ORDER BY COALESCE (comment_id, id) DESC, (commen

我有一个评论表(对像这样的文章):

comment\u id
引用的是同一表格中的
id
。当
comment\u id
NULL时,这意味着此注释是父项(它不是对另一条注释的响应,而是对文章本身的响应),但如果它不是NULL,则表示此注释是子项(它是对文章中另一条注释的响应)

我使用的查询以一种方式对结果进行排序,其中每个子项都显示在其父项下

SELECT *
FROM comments
ORDER BY
    COALESCE (comment_id, id) DESC, 
    (comment_id IS NULL) DESC, 
    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


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

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;

它给了我语法错误
#1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以获得正确的语法,使用第4行的“OVER(PARTITION BY comment_id)DESC,COALESCE(comment_id,id)DESC”,您没有运行我的答案中的代码,您正在运行其他代码:-)您的MariaDB版本是什么?我以为你给Oracle?
10.1.40-MariaDB-cll-lve-MariaDB Server
添加了问题标签,并在假设没有分析函数的情况下更新了
libmysql-5.1.73
答案。这是一种递归设计。注释可以有注释,也可以有注释,…在您的示例中,只有父项和子项,没有孙子。孩子的评论可以在你的数据库中有评论吗?或者这是被禁止的吗?@ThorstenKettner只允许孩子,可以有更多的嵌套。我不明白这个答案。“只允许有孩子”似乎意味着一个孩子不能有孩子。“可以有更多的嵌套”似乎意味着相反的意思。@ThorstenKettner我认为OP实际上是指
不能
@ThorstenKettner抱歉,我是说不能:)
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;