You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

执行后会得到如下结果:

idname
1namelvl1
2namelvl2

如果需要把当前节点也包含在结果里,直接去掉WHERE id !=3即可。


内容的提问来源于stack exchange,提问作者Сергій Катрюк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:08:59