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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:32:06