要高效查询MySQL数据库中某个部门及其所有子部门下的所有员工,并避免重复,可以使用递归查询(Recursive CTE)和适当的JOIN操作。以下是一个示例SQL查询,假设你有两个表:departments
和 employees
。
departments
表:
id
(部门ID)name
(部门名称)parent_id
(父部门ID,如果为顶级部门则为NULL)employees
表:
id
(员工ID)name
(员工姓名)department_id
(所属部门ID)employees
表进行JOIN,获取所有员工。WITH RECURSIVE SubDepartments AS (
-- 基础查询:选择指定的部门
SELECT id, name, parent_id
FROM departments
WHERE id = ? -- 这里替换为你要查询的部门ID
UNION ALL
-- 递归查询:选择所有子部门
SELECT d.id, d.name, d.parent_id
FROM departments d
INNER JOIN SubDepartments sd ON d.parent_id = sd.id
)
-- 查询所有子部门的员工
SELECT DISTINCT e.id, e.name, e.department_id
FROM employees e
INNER JOIN SubDepartments sd ON e.department_id = sd.id;
WITH RECURSIVE SubDepartments AS (...):这是一个递归CTE,用于查询指定部门及其所有子部门。
INNER JOIN
将子部门与父部门关联起来,直到没有更多的子部门为止。SELECT DISTINCT e.id, e.name, e.department_id:最后,将递归查询的结果与employees
表进行JOIN,获取所有员工,并使用DISTINCT
来避免重复。
cte_max_recursion_depth
参数。departments
表进行索引优化。departments
表的parent_id
列上创建索引,以加速递归查询。employees
表的department_id
列上创建索引,以加速JOIN操作。通过这种方式,你可以高效地查询某个部门及其所有子部门下的所有员工,并确保结果中没有重复记录。