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

yzxexxkh  于 2024-01-05  发布在  Mysql
关注(0)|答案(1)|浏览(166)

此问题在此处已有答案

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|
现在我使用以下查询:

  1. SELECT * FROM comments WHERE id = 1
  2. UNION
  3. SELECT * FROM comments WHERE parent_id IN (SELECT id FROM comments WHERE id = 1)
  4. UNION
  5. 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:

  1. WITH RECURSIVE cte (id, parent_id, content) AS (
  2. SELECT id, parent_id, content FROM comments WHERE id = 1 -- base case
  3. UNION ALL
  4. SELECT c.id, c.parent_id, c.content -- recursive case
  5. FROM comments c
  6. INNER JOIN cte t ON c.parent_id = t.id
  7. )
  8. SELECT * FROM cte ORDER BY id;

字符串

相关问题