我有一个带有父子层次结构的表格,支持多个(理论上无限)嵌套级别:
|------|-------------------|-------------|
| id | title | parent_id |
|------|-------------------|-------------|
| 1 | Dashboard | 0 |
| 2 | Content | 0 |
| 3 | Modules | 0 |
| 17 | User Modules | 3 |
| 31 | Categories | 17 |
| ... | | |
|------|-------------------|-------------|
我试图构建一个查询,使其产生一个串联列表,其中包含每个项目的所有父级项目,直到树中最高的父级为止:
|------|----------------------|
| id | concatenatedParents |
|------|----------------------|
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 17 | 3,0 |
| 31 | 17,3,0 |
| ... | |
|------|----------------------|
根据这里其他答案的建议,我已经构建了如下MySQL查询:
SELECT parentsTable._id, GROUP_CONCAT(parentsTable.parent_id SEPARATOR ',') as concatenatedParents FROM (
SELECT
@r AS _id,
(SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 31, @l := 0) vars,
menu m
WHERE @r <> 0
) as parentsTable
查看Fiddle代码: http://sqlfiddle.com/#!9/48d276f/902/0
但此查询仅适用于给定的一个子级id(在本例中为31)。我未能将此查询扩展到整个表格,是否有一种方法可以在每个下一行中重置计数器变量?
我看到许多答案建议使用固定数量的连接,但接受可变层次数的解决方案会更加可取。
在MySQL 8中,由于递归查询(感谢@GMB),这是可能的,但由于我们仍在运行MySQL 5.7,因此我想知道是否存在旧版本的解决方案。
id < parent_id
时),则可以理论上使用用户定义变量来解决该任务。如果没有,则只有存储过程可以帮助 - 我建议在任何情况下都使用此方法。 - Akina