如何用MySQL递归SQL统计分类父级的总订单金额?
实现方案:MySQL递归查询计算父级分类总金额
当然可以!这个需求在MySQL里完全能实现,核心是要处理分类的层级递归关系,把所有子分类(包括多级后代)的金额都归集到它们的顶级父分类上。下面是具体的SQL实现:
WITH RECURSIVE category_hierarchy AS ( -- 第一步:先找出所有顶级父分类(parent_id为NULL的分类) SELECT id, name, id AS top_parent_id FROM category WHERE parent_id IS NULL UNION ALL -- 第二步:递归遍历所有子分类,将它们关联到对应的顶级父分类 SELECT c.id, c.name, ch.top_parent_id FROM category c INNER JOIN category_hierarchy ch ON c.parent_id = ch.id ) -- 第三步:关联订单表,按顶级父分类分组计算总金额 SELECT ch.top_parent_id AS category, SUM(orw.amount) AS total FROM category_hierarchy ch INNER JOIN orderrows orw ON ch.id = orw.category GROUP BY ch.top_parent_id ORDER BY ch.top_parent_id;
代码思路解释:
- 递归CTE构建层级关系:
category_hierarchy这个递归公共表表达式(CTE)会生成每个分类对应的顶级父分类ID:- 锚点部分:先筛选出所有没有父分类的顶级分类,它们的
top_parent_id就是自己的ID; - 递归部分:不断将子分类和上一层的分类关联,把父分类的
top_parent_id传递给子分类,直到遍历完所有层级的分类。
- 锚点部分:先筛选出所有没有父分类的顶级分类,它们的
- 关联订单表聚合求和:把生成的层级表和
orderrows表关联,按顶级父分类ID分组,对amount求和,就能得到每个父分类包含所有子分类的总金额。
运行这段SQL后,你会得到完全符合预期的结果:
| category | total |
|---|---|
| 1 | 200 |
| 2 | 600 |
如果你的MySQL版本低于8.0(不支持递归CTE),可以使用多次自连接的方式处理,但递归CTE的写法更简洁、易维护,也能适配任意深度的分类层级。
内容的提问来源于stack exchange,提问作者takethat
相关产品推荐
相关产品推荐

