LeetCode--1270. 向公司 CEO 汇报工作的所有人

28 阅读3分钟

1. 题目描述

员工表:Employees

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| employee_id   | int     |
| employee_name | varchar |
| manager_id    | int     |
+---------------+---------+

employee_id 是这个表具有唯一值的列 这个表中每一行中, employee_id 表示职工的 ID, employee_name 表示职工的名字, manager_id 表示该职工汇报工作的直线经理 这个公司 CEO 是 employee_id = 1 的人

编写解决方案, 找出所有直接或间接向公司 CEO 汇报工作的职工的 employee_id

由于公司规模较小, 经理之间的间接关系 不超过 3 个经理

可以以 任何顺序 返回无重复项的结果

2. 测试用例

输入: Employees table:

+-------------+---------------+------------+
| employee_id | employee_name | manager_id |
+-------------+---------------+------------+
| 1           | Boss          | 1          |
| 3           | Alice         | 3          |
| 2           | Bob           | 1          |
| 4           | Daniel        | 2          |
| 7           | Luis          | 4          |
| 8           | Jhon          | 3          |
| 9           | Angela        | 8          |
| 77          | Robert        | 1          |
+-------------+---------------+------------+

输出:

+-------------+
| employee_id |
+-------------+
| 2           |
| 77          |
| 4           |
| 7           |
+-------------+

解释:

  • 公司 CEO 的 employee_id 是 1
  • employee_id 是 2 和 77 的职员直接汇报给公司 CEO
  • employee_id 是 4 的职员间接汇报给公司 CEO 4 --> 2 --> 1
  • employee_id 是 7 的职员间接汇报给公司 CEO 7 --> 4 --> 2 --> 1
  • employee_id 是 3, 8, 9 的职员不会直接或间接的汇报给公司 CEO

3. 解题思路

可以将员工到 CEO 的层级关系, 分为 一级经理, 二级经理, 三级经理, 按照题目的意思只需要查询到三级经理

  1. 查询领导是 CEO 的员工信息, 需要注意排除CEO, 简单点理解: 查询一级经理
select * from Employees where manager_id = 1 and employee_id != 1;

查询结果

+-----------+-------------+----------+
|employee_id|employee_name|manager_id|
+-----------+-------------+----------+
|2          |Bob          |1         |
|77         |Robert       |1         |
+-----------+-------------+----------+
  1. 查询领导为步骤 1 中一级经理的员工信息, 以及步骤 1 的一级经理的信息, 通过 Employees e2 left join Employees e3 on e2.manager_id = e3.employee_id 筛选数据, 需要需要注意排除CEO, 简单点理解: 查询一级和二级经理
select *
from Employees e2
         left join Employees e3 on e2.manager_id = e3.employee_id
where e3.manager_id = 1
  and e2.employee_id != 1;

查询信息, 前三个字段是员工信息, 后面三个字段是上一级经理的信息

+-----------+-------------+----------+-----------+-------------+----------+
|employee_id|employee_name|manager_id|employee_id|employee_name|manager_id|
+-----------+-------------+----------+-----------+-------------+----------+
|2          |Bob          |1         |1          |Boss         |1         |
|4          |Daniel       |2         |2          |Bob          |1         |
|77         |Robert       |1         |1          |Boss         |1         |
+-----------+-------------+----------+-----------+-------------+----------+
  1. 将领导为步骤 2 中二级经理的员工信息, 以及步骤 2 中一级和二级经理信息, 通过 Employees e1 left join Employees e2 on e1.manager_id = e2.employee_id 筛选数据, 需要需要注意排除CEO, 简单点理解: 查询一级, 二级, 三级经理信息
select *
from Employees e1
         left join Employees e2 on e1.manager_id = e2.employee_id
         left join Employees e3 on e2.manager_id = e3.employee_id
where e3.manager_id = 1
  and e1.employee_id != 1;

查询结果, 前三个字段是员工信息, 中间三个字段是上一级经理的信息, 最后三个字段是上级的上级经理信息

+-----------+-------------+----------+-----------+-------------+----------+-----------+-------------+----------+
|employee_id|employee_name|manager_id|employee_id|employee_name|manager_id|employee_id|employee_name|manager_id|
+-----------+-------------+----------+-----------+-------------+----------+-----------+-------------+----------+
|2          |Bob          |1         |1          |Boss         |1         |1          |Boss         |1         |
|4          |Daniel       |2         |2          |Bob          |1         |1          |Boss         |1         |
|7          |Luis         |4         |4          |Daniel       |2         |2          |Bob          |1         |
|77         |Robert       |1         |1          |Boss         |1         |1          |Boss         |1         |
+-----------+-------------+----------+-----------+-------------+----------+-----------+-------------+----------+
  1. 按照题目要求, 返回员工 id
select e1.employee_id
from Employees e1
         left join Employees e2 on e1.manager_id = e2.employee_id
         left join Employees e3 on e2.manager_id = e3.employee_id
where e3.manager_id = 1
  and e1.employee_id != 1;

查询结果

+-----------+
|employee_id|
+-----------+
|2          |
|4          |
|7          |
|77         |
+-----------+