导读:本期聚焦于小伙伴创作的《mysql如何查询子节点?树形结构数据递归查询的几种实现方案》,敬请观看详情。在电商类目或组织架构系统中,数据常以父子层级方式存储于单张表。当已知某个父节点ID,要取出其下所有子节点时,很多人第一反应是写循环查库,但这会产生大量连接开销。MySQL 8.0提供的WITH RECURSIVE语法能从根节点出发,依据自关联外键逐层展开,一次查询即得完整子树。低版本则可通过用户变量模拟路径枚举,或设计冗余的左右值字段来范围扫描。理解每种方案对索引和写入的影响,才能避免深层树查询时的性能陡降。

在业务系统中,部门、商品分类、评论回复等数据经常以父子关系保存在同一张表里。面对已知某个节点,需要把它下面所有层级的子节点全部拿出来这种需求,如果只靠应用层多次查询数据库,不仅代码繁琐,而且网络往返会带来明显延迟。下面整理几种在MySQL中查询子节点的实用做法。

mysql如何查询子节点?树形结构数据递归查询的几种实现方案

一、使用WITH RECURSIVE实现递归查询

MySQL 8.0及以上版本支持公用表表达式(CTE),其中WITH RECURSIVE可以很方便地做层级展开。假设有表category,字段为id、name、parent_id。

-- 查询id为1的节点及其所有子节点
WITH RECURSIVE cte AS (
    SELECT id, name, parent_id
    FROM category
    WHERE id = 1
    UNION ALL
    SELECT c.id, c.name, c.parent_id
    FROM category c
    INNER JOIN cte ON c.parent_id = cte.id
)
SELECT * FROM cte;

上面的语句先选出起始节点,再通过自连接不断找出下一层,直到没有新记录为止。对parent_id建立索引可以显著提升递归效率。

二、低版本MySQL的变量模拟法

如果数据库不支持递归CTE,可以利用用户变量拼接路径,再借助FIND_IN_SET匹配。

-- 假设已知根节点id为1
SELECT c.*
FROM (
    SELECT id, parent_id,
        @path := IF(parent_id = 1 OR FIND_IN_SET(parent_id, @path), CONCAT(@path, ',', id), NULL) AS path
    FROM category, (SELECT @path := '1') AS v
    ORDER BY id
) AS t
JOIN category c ON c.id = t.id
WHERE t.path IS NOT NULL;

这种写法依赖排序和变量赋值顺序,逻辑不够直观,仅建议作为兼容旧版本的临时方案。

三、左右值树模型(预排序遍历)

另一种思路是在表中冗余left_val和right_val,使整棵子树落在一段连续区间内。

字段说明
id节点主键
left_val前序遍历左值
right_val前序遍历右值
-- 查询左值在父节点范围内的所有子节点
SELECT child.*
FROM category child, category parent
WHERE parent.id = 1
  AND child.left_val BETWEEN parent.left_val AND parent.right_val;

该方式查询极快,但插入和移动节点需要重算大量左右值,适合读多写少的场景。

四、方案对比与建议

  • 递归CTE:语法清晰,维护简单,推荐MySQL 8.0+使用。
  • 变量模拟:兼容性最好,但可读性与稳定性差。
  • 左右值:查询性能最优,写入成本高。

实际选型时,应先确认数据库版本与读写比例,再决定采用哪种方式查询子节点。

mysql递归查询树形结构修改时间:2026-07-31 10:27:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。