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

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_idnode_pathsum(value)
node11,2,5,78
node21,2,6,78
node31,3,5,77
node41,4,76

4. 小扩展说明

  • 如果你的MySQL版本低于8.0,递归CTE不支持,那得用存储过程或自定义函数实现递归遍历,复杂度会高很多,建议尽量升级到8.0+版本。
  • 如果存在多个根节点(即有多个节点没有父节点),可以把锚点成员的WHERE条件改成from NOT IN (SELECT to FROM node_relations),就能自动识别所有根节点的路径。

内容的提问来源于stack exchange,提问作者egi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:33:24