如何在MySQL表中递归查询所有父节点?附指定ID查询场景
MySQL递归查询父节点完全指南
刚好最近经常帮人解决这类层级数据的查询问题,我来一步步给你讲清楚~
问题一:如何在MySQL表中递归查询所有父节点?
从MySQL 8.0版本开始,官方支持了递归CTE(公共表表达式),这是处理层级递归查询最简洁高效的方式。核心思路是通过「锚点查询+递归关联」的方式,逐层向上追溯父节点,直到根节点(parent_id为null的节点)。
举个通用的例子,假设你的表名为your_table,结构包含id、name、parent_id三个字段,递归查询任意节点所有父节点的语法如下:
WITH RECURSIVE parent_hierarchy AS ( -- 锚点成员:先选中目标节点作为起始点 SELECT id, name, parent_id FROM your_table WHERE id = [目标节点ID] -- 替换成你要查询的节点ID UNION ALL -- 递归成员:关联父节点,直到parent_id为null SELECT t.id, t.name, t.parent_id FROM your_table t INNER JOIN parent_hierarchy ph ON t.id = ph.parent_id ) -- 最后取出所有父节点(如果需要排除自身,可以加WHERE id != [目标节点ID]) SELECT * FROM parent_hierarchy;
简单拆解下逻辑:
WITH RECURSIVE声明这是一个递归CTE结构- 锚点部分先定位到你要查询的目标节点,作为递归的起点
- 递归部分通过
INNER JOIN把当前层级的parent_id和上一层的id关联,不断向上遍历父节点,直到没有父节点(parent_id为null)时自动停止递归
如果你的MySQL版本低于8.0(现在不推荐使用旧版本啦),可以用自定义函数或存储过程实现,但代码会复杂很多,优先推荐CTE方案。
问题二:获取id=3对应的所有父节点列表
针对你给出的表结构,直接套用上面的CTE语法,把目标ID换成3就行。如果只需要纯父节点(排除自身),可以在最后加过滤条件:
WITH RECURSIVE parent_hierarchy AS ( SELECT id, name, parent_id FROM your_table WHERE id = 3 UNION ALL SELECT t.id, t.name, t.parent_id FROM your_table t INNER JOIN parent_hierarchy ph ON t.id = ph.parent_id ) -- 只取父节点,排除自身 SELECT id, name FROM parent_hierarchy WHERE id != 3;
执行后会得到如下结果:
| id | name |
|---|---|
| 1 | namelvl1 |
| 2 | namelvl2 |
如果需要把当前节点也包含在结果里,直接去掉WHERE id !=3即可。
内容的提问来源于stack exchange,提问作者Сергій Катрюк
相关产品推荐
相关产品推荐

