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

MySQL父子层级表查询如何实现父节点行展示在对应子节点之后

解决方案

原有查询的问题说明

  • 关联表顺序写反:你需要查询所有员工及对应上级,应该以员工表为主表关联上级表,原写法只能查到有下级的上级记录
  • 空值判断错误:SQL中不能用= NULL判断空值,该写法永远返回布尔值未知,无法匹配到任何记录,正确写法为IS NULL
  • 缺少符合需求的排序规则:原排序无法实现父节点排在对应子节点之后的效果

测试表示例实现

针对你给出的my table测试数据,实现代码如下:

SELECT 
    t.name,
    p.name AS parent_name
FROM my_table t
LEFT JOIN my_table p ON t.parent_id = p.id
ORDER BY 
    -- 先将同一父节点下的所有记录(包括父节点自身)分到同一组
    COALESCE(p.name, t.name),
    -- 同组内父节点排序优先级低于子节点,实现子在前父在后
    CASE WHEN t.parent_id IS NULL THEN 1 ELSE 0 END,
    -- 同层级节点按名称排序
    t.name

执行后即可得到你期望的测试结果。

master_employee表适配代码

针对你的业务表场景,修正后的完整查询代码如下:

SELECT 
    me.employee_name as employee_name,
    me_cam.employee_name as cam_manager_name, 
    me.employee_code
FROM master_employee me
LEFT JOIN master_employee me_cam 
    ON me.cam_manager_code = me_cam.employee_code 
    AND me_cam.deleted = 'N'
WHERE me.deleted = 'N'
ORDER BY 
    COALESCE(me_cam.employee_name, me.employee_name),
    CASE WHEN me.cam_manager_code IS NULL THEN 1 ELSE 0 END,
    me.employee_name

如果你只需要查询没有上级的员工+他们的下级,只需要在WHERE条件中额外增加me_cam.employee_code IS NOT NULL OR me.cam_manager_code IS NULL即可。

内容的提问来源于stack exchange,提问作者user15293852

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:15:01