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.
相关产品推荐
相关产品推荐

