如何用单条MySQL查询按指定顺序检索父级与子级数据?
当然可以用单条MySQL查询实现这个需求!
你的需求本质是先按父节点(或自身作为父节点)的名称分组排序,组内先显示父节点,再按子节点的名称排序。我们可以通过自连接和自定义排序规则来实现:
实现代码
SELECT t1.ID, t1.Name, t1.ParentID FROM your_table t1 LEFT JOIN your_table t2 ON t1.ParentID = t2.ID ORDER BY -- 首先按父节点(或自身)的名称分组,确保Foo组在前,Bar组在后 COALESCE(t2.Name, t1.Name), -- 组内优先显示父节点(ParentID为null的项) CASE WHEN t1.ParentID IS NULL THEN 0 ELSE 1 END, -- 子节点按名称自然排序,匹配你要的SubA→SubB→SubC顺序 t1.Name;
逻辑说明
- 自连接:通过
LEFT JOIN关联自身表,让每个子节点能获取到对应父节点的名称; - COALESCE排序:用
COALESCE(t2.Name, t1.Name)确保父节点用自己的Name、子节点用父节点的Name作为分组依据,这样Foo相关的所有节点会被分到一组,Bar的分到另一组; - 父节点优先:用
CASE表达式给父节点标记排序值0,子节点标记1,保证组内父节点排在最前面; - 子节点排序:最后按子节点的
Name排序,正好匹配你需要的SubA→SubB→SubC的顺序。
把your_table替换成你实际的表名,执行这条查询就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者zleek
相关产品推荐
相关产品推荐

