MySQL层级图查询求助:父子ID表生成路径及值求和
嘿,这个层级路径求和的需求我熟!刚好可以用MySQL 8.0及以上版本的**递归CTE(Common Table Expression)**来搞定,我给你详细拆解下实现步骤,保证能拿到你想要的结果:
1. 先确认表结构与测试数据
先把你的表结构和数据转换成可直接执行的SQL,方便你复现测试:
CREATE TABLE node_relations ( `from` INT, `to` INT, value INT ); INSERT INTO node_relations VALUES (1,2,2), (1,3,3), (1,4,4), (2,5,5), (2,6,4), (3,5,3), (4,7,2), (5,7,1), (6,7,2);
2. 递归CTE查询实现路径拼接与值求和
核心就是用递归CTE从根节点开始,逐层拼接路径并累加value,最后筛选出到叶子节点的完整路径:
WITH RECURSIVE path_sum AS ( -- 锚点成员:从根节点1出发的第一层路径 SELECT `from` AS start_node, `to` AS current_node, CONCAT(`from`, ',', `to`) AS path, value AS sum_value FROM node_relations WHERE `from` = 1 -- 这里指定根节点为1,若有多个根可调整条件 UNION ALL -- 递归成员:逐层拼接后续节点,累加路径值 SELECT ps.start_node, nr.`to`, CONCAT(ps.path, ',', nr.`to`) AS path, ps.sum_value + nr.value AS sum_value FROM path_sum ps JOIN node_relations nr ON ps.current_node = nr.`from` ) -- 筛选叶子节点的路径(叶子节点是没有子节点的,即`to`不在`from`列中) SELECT CONCAT('node', ROW_NUMBER() OVER()) AS node_id, path AS node_path, sum_value AS `sum(value)` FROM path_sum WHERE current_node NOT IN (SELECT `from` FROM node_relations);
3. 查询结果展示
运行上面的SQL后,会得到所有从根节点1到叶子节点7的完整路径及对应value总和,结果格式完全符合你的要求:
| node_id | node_path | sum(value) |
|---|---|---|
| node1 | 1,2,5,7 | 8 |
| node2 | 1,2,6,7 | 8 |
| node3 | 1,3,5,7 | 7 |
| node4 | 1,4,7 | 6 |
4. 小扩展说明
- 如果你的MySQL版本低于8.0,递归CTE不支持,那得用存储过程或自定义函数实现递归遍历,复杂度会高很多,建议尽量升级到8.0+版本。
- 如果存在多个根节点(即有多个节点没有父节点),可以把锚点成员的WHERE条件改成
from NOT IN (SELECT to FROM node_relations),就能自动识别所有根节点的路径。
内容的提问来源于stack exchange,提问作者egi
相关产品推荐
相关产品推荐

