在自引用中排序 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_id
为 NULL 时,这意味着此评论为 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;
我有 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_id
为 NULL 时,这意味着此评论为 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;