如何用MySQL查询同一张categories表中的父分类及其所属子分类
解决方案
两级分类场景(你当前的业务场景适用)
如果你的分类只有父子两级(不存在三级及以上子分类),直接通过自定义排序规则即可实现需求,兼容所有MySQL版本,执行效率更高:
SELECT categoryId, categoryName, parentCategoryId FROM categories ORDER BY -- 按根分类ID分组,同一个父分类的所有数据排在一起 CASE WHEN parentCategoryId = 0 THEN categoryId ELSE parentCategoryId END, -- 同一个分组内父分类排在最前,子分类在后 parentCategoryId, -- 同级别分类按ID升序,保证结果顺序稳定 categoryId;
多级分类通用场景(支持任意层级树形结构)
如果后续可能扩展多级分类,或者当前已经存在三级及以上的分类,使用递归CTE实现树形结构排序:
WITH RECURSIVE category_tree AS ( -- 先查询所有顶级父分类 SELECT categoryId, categoryName, parentCategoryId, categoryId AS root_id, -- 记录根分类ID用于分组排序 1 AS level -- 记录分类层级,顶级层级为1 FROM categories WHERE parentCategoryId = 0 UNION ALL -- 递归查询所有子分类 SELECT c.categoryId, c.categoryName, c.parentCategoryId, ct.root_id, ct.level + 1 FROM categories c INNER JOIN category_tree ct ON c.parentCategoryId = ct.categoryId ) SELECT categoryId, categoryName, parentCategoryId FROM category_tree ORDER BY root_id, level, categoryId;
原有语句问题说明
你之前使用的自连接语句会将子分类和对应父分类的字段合并为同一行返回,无法得到你需要的逐行按父子顺序排列的结果,因此不需要使用自连接,通过调整排序规则即可满足需求。
内容的提问来源于stack exchange,提问作者Ramesh S
相关产品推荐
相关产品推荐

