MySQL 8.0.6递归查询如何从层级结果中排除无下属的叶子节点
解决方案
你只需要在原有递归CTE的最终查询逻辑中,增加EXISTS条件过滤掉无直接下属的叶子节点即可,同时注意修正原有递归逻辑中拼接路径的字段笔误(原代码误用了不存在的employee_first_name/employee_last_name字段,替换为表中实际的u_name字段)。
修改后的完整查询如下:
WITH RECURSIVE cte_connect_by AS ( SELECT 1 AS level, CAST(CONCAT('-> ', u_name) AS VARCHAR(4000)) AS connect_by_path, usr.* FROM users usr WHERE u_id =10 UNION ALL SELECT level + 1 AS level, CONCAT(connect_by_path, ' / ', usr.u_name) AS connect_by_path, usr.* FROM cte_connect_by r INNER JOIN users usr ON r.u_id = usr.rep_mgr ) SELECT u_id, u_name, level, connect_by_path path FROM cte_connect_by -- 仅保留存在直接下属的用户 WHERE EXISTS ( SELECT 1 FROM users u WHERE u.rep_mgr = cte_connect_by.u_id ) ORDER BY level;
逻辑说明
EXISTS子句会检查当前查询到的用户ID,是否在users表的rep_mgr字段中出现过,只要有任意一条记录的rep_mgr等于当前用户u_id,就说明该用户有直接下属,符合返回条件,否则就会被过滤掉。
内容的提问来源于stack exchange,提问作者Sims Susee
相关产品推荐
相关产品推荐

