MySQL 5.7如何单查询获取父级分类及所有层级子级节点?
实现父级分类及其所有层级子分类的MySQL递归查询
完全可行,MySQL 8.0及以上版本支持递归CTE(公共表表达式),可以通过单个查询一次性拉取父级分类(来自clients_categories)及其所有层级的子分类。
1. 表结构说明(根据描述推断)
categories表:包含category_id(主键)、category_name(分类名称)、parent_id(父分类ID,顶级分类父ID为0或NULL)clients_categories表:存储客户关联的父级分类,包含client_id、category_id(关联的父分类ID)
2. 递归查询SQL语句
WITH RECURSIVE category_hierarchy AS ( -- 初始数据集:获取客户关联的所有顶级父分类 SELECT cc.client_id, c.category_id, c.category_name, c.parent_id, 1 AS level, CAST(c.category_name AS CHAR(255)) AS path FROM clients_categories cc JOIN categories c ON cc.category_id = c.category_id WHERE c.parent_id = 0 -- 若顶级分类parent_id为NULL,改为WHERE c.parent_id IS NULL UNION ALL -- 递归遍历子分类 SELECT ch.client_id, c.category_id, c.category_name, c.parent_id, ch.level + 1 AS level, CONCAT(ch.path, ' > ', c.category_name) AS path FROM category_hierarchy ch JOIN categories c ON ch.category_id = c.parent_id ) -- 输出最终结果,按客户、层级排序 SELECT client_id, category_id, category_name, parent_id, level, path FROM category_hierarchy ORDER BY client_id, level, category_id;
3. 关键细节调整
- 如果你的
categories表中顶级分类的parent_id是NULL,请修改初始步骤的WHERE条件 level字段标记分类所处层级,父级为1,子级逐层递增path字段生成分类的层级路径,直观展示归属关系- 该查询支持任意层级的子分类递归,无需修改代码适配层级数量
4. 结果说明
查询结果会包含客户ID、分类ID、分类名称、父分类ID、层级和路径,与你期望的结果结构完全匹配。
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

