[英]MySQL self join with limited hierarchy
嗨,我有一个自我加入的MySQL表,我正在使用它进行评论和回复。
CREATE TABLE comments (id INT, parent_id INT, comment VARCHAR(50));
INSERT INTO comments VALUES
(1, 0, 'comment 1' ),
(2, 0, 'comment 2' ),
(3, 0, 'comment 3' ),
(4, 1, 'comment 1 - reply 1' ),
(5, 0, 'comment 4' ),
(6, 3, 'comment 3 - reply 1' ),
(7, 1, 'comment 1 - reply 2' ),
(8, 0, 'comment 5' );
仅有一个级别的答复。 也就是说,答复只能与顶级注释(其中parent_id = 0)相关联。
我使用以下查询显示每个顶级注释(其中parent_id = 0)和每个与注释相关的答复。
SELECT *
FROM comments
ORDER BY IF(parent_id = 0, id, parent_id) desc , parent_id != 0, id desc
输出:
id parent_id comment
-------------------------
8 0 comment 5
5 0 comment 4
3 0 comment 3
6 3 comment 3 - reply 1
2 0 comment 2
1 0 comment 1
7 1 comment 1 - reply 2
4 1 comment 1 - reply 1
当前查询对于我所需要的运行良好。
我的问题是如何限制每个评论的回复数量? 例如。 显示最新的50条顶级评论,每个评论最多2条回复。
尝试这个:
编辑:
SELECT pc.id,
pc.parent_id,
pc.comment
FROM (
SELECT id,
parent_id,
comment,
@parentRank := @parentRank + 1 AS rank
FROM comments,
(SELECT @parentRank := 0) pcr
WHERE parent_id = 0
ORDER BY id DESC
) pc
WHERE pc.rank <= 5
UNION
SELECT cc.id,
cc.parent_id,
cc.comment
FROM (
SELECT id,
parent_id,
comment,
@childRank := if(@current_parent_id = parent_id, @childRank + 1, 1) AS rank,
@current_parent_id := parent_id
FROM comments,
(SELECT @childRank := 0) cr
WHERE parent_id in (
SELECT id
FROM (
SELECT id,
@parentRank := @parentRank + 1 AS rank
FROM comments,
(SELECT @parentRank := 0) pcr
WHERE parent_id = 0
ORDER BY id DESC
) pc
WHERE pc.rank <= 5
)
ORDER BY parent_id DESC,
id DESC
) cc
WHERE cc.rank <= 1
ORDER BY IF(parent_id = 0, id, parent_id) desc , parent_id != 0, id desc
我在SQLFiddler中做了一个演示
限制(偏移量)的第一个参数控制答复的数量
SELECT *,
(SELECT COUNT(id) FROM comments r where r.parent_id = c.id) AS number_of_replies
FROM comments c
WHERE IFNULL((SELECT e.id FROM comments e WHERE e.parent_id != 0 AND
e.parent_id = c.parent_id ORDER BY e.id DESC LIMIT 2, 1), 0) < c.id
ORDER BY IF(parent_id = 0, id, parent_id) desc , parent_id != 0, id desc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.