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

MySQL 8.0 层级树结构实现父子节点学生人数累计求和方案咨询

MySQL 8.0 层级节点求和纯SQL实现方案

核心基于MySQL 8.0支持的**递归公用表表达式(Recursive CTE)**实现,无需临时表,单条SQL即可完成「当前节点+所有子节点数值累加」的需求。

完整SQL代码

WITH RECURSIVE school_hierarchy AS (
    -- 锚点:将每个节点作为自身层级的根节点,初始化统计值
    SELECT 
        schoolId AS root_id,
        name AS root_name,
        parentID AS root_parent_id,
        year AS stat_year,
        schoolId,
        amountStudents
    FROM School
    
    UNION ALL
    
    -- 递归部分:遍历根节点的所有子节点,收集所有子节点的学生数
    SELECT 
        h.root_id,
        h.root_name,
        h.root_parent_id,
        h.stat_year,
        s.schoolId,
        s.amountStudents
    FROM school_hierarchy h
    INNER JOIN School s ON h.schoolId = s.parentID AND s.year = h.stat_year
)
-- 按根节点分组求和,得到每个节点自身+所有子节点的总学生数
SELECT 
    root_id AS id,
    root_parent_id AS parentId,
    stat_year AS year,
    root_name AS name,
    (SELECT amountStudents FROM School WHERE schoolId = root_id AND year = stat_year) AS amountStudents,
    SUM(amountStudents) AS totalAmount
FROM school_hierarchy
GROUP BY root_id, root_parent_id, stat_year, root_name
ORDER BY root_parent_id, root_id;

逻辑说明

  • 锚点层会遍历所有学校节点,每个节点都会被标记为独立的根节点,保留自身的基础信息和学生数
  • 递归层会不断匹配根节点对应的所有层级子节点,把所有子节点的学生数都归集到对应根节点的统计集合中
  • 最终分组求和时,每个根节点的统计集合包含了自身+所有后代子节点的学生数,求和结果就是需要的总人数
  • 代码默认按年份隔离统计,如果不需要区分年份,删掉SQL中所有和year相关的判断逻辑即可

注意事项

你之前用到的DECLARE @result TABLE是SQL Server的专属语法,MySQL不支持该写法,上述方案是MySQL 8.0原生支持的语法,可直接运行。

内容的提问来源于stack exchange,提问作者Maxime C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:33:02