繁体   English   中英

MySQL自我连接,层次结构有限

[英]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条回复。

如果有帮助,这是一个SqlFiddle

尝试这个:

编辑:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM