mysql 有部门表(unique_code,parent_code,relati e_codes),relarie_codes是部门路径包括父级部门、本身部门和子部门,查询全部部门和子部门人员根据部门分组显示部门人数
时间: 2024-01-21 12:16:16 浏览: 145
员工表,部门表和工资表
可以使用 MySQL 的递归查询功能来实现这个需求。具体步骤如下:
1. 创建一个临时表,用于存储每个部门的子部门路径和所属部门的 unique_code。
```mysql
CREATE TEMPORARY TABLE IF NOT EXISTS temp_dept_path (
dept_path VARCHAR(255) NOT NULL,
dept_code VARCHAR(10) NOT NULL
);
```
2. 插入初始的部门数据,即包含所有一级部门的记录。
```mysql
INSERT INTO temp_dept_path (dept_path, dept_code)
SELECT CONCAT(unique_code, '/') AS dept_path, unique_code AS dept_code
FROM department
WHERE parent_code IS NULL;
```
3. 使用递归查询,依次获取每个部门的所有子部门路径和所属部门的 unique_code,并插入到临时表中。
```mysql
INSERT INTO temp_dept_path (dept_path, dept_code)
WITH RECURSIVE dept_path_cte (dept_path, dept_code) AS (
SELECT CONCAT(unique_code, '/'), unique_code
FROM department
WHERE parent_code IS NULL
UNION ALL
SELECT CONCAT(cte.dept_path, d.unique_code, '/'), d.unique_code
FROM department d
JOIN dept_path_cte cte ON cte.dept_code = d.parent_code
)
SELECT dept_path, dept_code
FROM dept_path_cte;
```
4. 使用临时表和员工表进行关联,按照部门分组统计员工数量。
```mysql
SELECT d.unique_code AS dept_code, COUNT(*) AS employee_count
FROM temp_dept_path tp
JOIN department d ON tp.dept_code = d.unique_code
JOIN employee e ON FIND_IN_SET(d.unique_code, e.relation_codes)
GROUP BY d.unique_code;
```
最终的查询结果会按照部门的 unique_code 排序,并列出每个部门的 unique_code 和员工数量。
阅读全文