讲给一张表,表字段分别为 id 、姓名、部分、经理id,可能存在张三既是下属也是经理
现在找出下属起码有5名员工的经理
CREATE TABLE Employee ( id INT, name VARCHAR(255), department VARCHAR(255), managerId INT ); INSERT INTO Employee (id, name, department, managerId) VALUES (101, 'John', 'A', NULL), (102, 'Dan', 'A', 101), (103, 'James', 'A', 101), (104, 'Amy', 'A', 101), (105, 'Anne', 'A', 101), (106, 'Ron', 'B', 101), (107, 'tt1', 'B', 102), (108, 'tt2', 'B', 102), (109, 'tt3', 'B', 102), (110, 'tt4', 'A', 102), (111, 'tt5', 'A', 103), (112, 'tt6', 'A', 103), (113, 'tt7', 'A', 103); select Name from ( select Manager.Name as Name, count(Report.Id) as cnt from Employee as Manager join Employee as Report on Manager.Id = Report.managerId group by Manager.id ) where cnt >= 3;
################################### 思路讲同一张表变成两张表,一张经理表,一张下属表,然后根据经理表的id == 员工表中经理表id 进行 join on 生成一张新表,然后在用筛选条件 找出cnt >= 5 的name
####### 参考 #######注意 方法一 开销很大 # 找出至少有五个直接下属的经理 --> 找出 经理 下面至少有5个员工 -- select name -- from Employee -- where id in (select managerId -- from Employee -- group by managerId -- having count(*) >= 5); /* john 5 */ select Name from ( select Manager.Name as Name, count(Report.Id) as cnt from Employee as Manager join Employee as Report on Manager.Id = Report.managerId group by Manager.id ) as ReportCount where cnt>=5; #方法二 ######更新 使用 having select Manager.Name as Name from Employee as Manager join Employee as Report on Manager.Id = Report.managerId group by Manager.Id having count(Report.Id) >= 5; ######方法3 select Employee.name as name from( select ManagerId from Employee group by ManagerId having count(ManagerId) >= 5 )as Manager join Employee on Manager.ManagerId = Employee.Id;
以下是gpt 对group by 和 having 的解释
CREATE TABLE Employee ( id INT, name VARCHAR(255), department VARCHAR(255), managerId INT ); INSERT INTO Employee (id, name, department, managerId) VALUES (101, 'John', 'A', NULL), (102, 'Dan', 'A', 101), (103, 'James', 'A', 101), (104, 'Amy', 'A', 101), (105, 'Anne', 'A', 101), (106, 'Ron', 'B', 101), (107, 'tt1', 'B', 102), (108, 'tt2', 'B', 102), (109, 'tt3', 'B', 102), (110, 'tt4', 'C', 102), (111, 'tt5', 'C', 103), (112, 'tt6', 'C', 103), (113, 'tt7', 'D', 103); select count(Employee.department) from Employee group by Employee.department having count(Employee.department) >=3 ;
在线sql编辑器