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;