mysql 单个查询中的多个SELECT(分层查询)[重复]

yzxexxkh  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(61)

此问题在此处已有答案

How to create a MySQL hierarchical recursive query?(16个回答)
21天前关闭
我有一个comments表,内容如下
| ID|父ID|内容|
| --|--|--|
| 1 |NULL|一|
| 2 |NULL| B|
| 3 |NULL| C|
| 4 | 1 |AA|
| 5 | 1 |AB|
| 6 | 1 |AC|
| 7 | 5 |阿坝|
| 8 | 5 |ABB|
我想选择comment with id = 1,所有的都是childrengrand children。类似这样
| ID|父ID|内容|
| --|--|--|
| 1 |NULL|一|
| 4 | 1 |AA|
| 5 | 1 |AB|
| 6 | 1 |AC|
| 7 | 5 |阿坝|
| 8 | 5 |ABB|
现在我使用以下查询:

SELECT * FROM comments WHERE id = 1
UNION
SELECT * FROM comments WHERE parent_id IN (SELECT id FROM comments WHERE id = 1)
UNION
SELECT * FROM comments WHERE parent_id IN (SELECT id FROM comments WHERE parent_id IN (SELECT id FROM comments WHERE id = 1));

字符串
但是这种解决方案很快就会变得一团糟,而且容易出错,特别是当我还想得到更深层次的孩子,比如grand grand grand children时。
所以我的问题是,有没有什么方法可以让这个查询更简单?或者更高效?

bbmckpt7

bbmckpt71#

在MySQL 8+上,我们可以使用递归CTE:

WITH RECURSIVE cte (id, parent_id, content) AS (
    SELECT id, parent_id, content FROM comments WHERE id = 1  -- base case
    UNION ALL
    SELECT c.id, c.parent_id, c.content                       -- recursive case
    FROM comments c
    INNER JOIN cte t ON c.parent_id = t.id
)

SELECT * FROM cte ORDER BY id;

字符串

相关问题