力扣高频sql题-至少有5名直接下属的经理

94 阅读2分钟

题目

至少有5名直接下属的经理

至少有5名下属经历.png

我的思路

先根据group by 分组查询 managerId,把查询结果作为一张表1,再查询满足条件经理人数大于5的一张表2,表2与主表Employee进行连接查询,得到最终结果

select managerId  ,count(*) c  from Employee where  managerId is not null  group by managerId
select a.name name  from Employee a join (select * from (select managerId  ,count(*) c  from Employee where  managerId is not null  group by managerId )a where a.c>=5) x on a.id  =x.managerId

大佬思路

时间复杂度 O(n)!

having的使用:

  • having在order by 中的使用

GROUP BY子句 : 将查询结果按某一列或多列的值分组,值相等的为一组。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用 HAVING短语指定筛选条件。

思路:将两张Employee进行关联,条件:a.managerId=b.id a表为主表,根据b表查出的数据,再进行分组,通过having判断复合条件的结果

select b.name from Employee a left join Employee b on a.managerId=b.id group by 
b.name having count(b.id) >= 5

问题:为什么要a.managerId=b.id

解答

select b.name from Employee a left join Employee b on a.managerId=b.id

输出结果:

输出结果5个经理属下.png

通过a.managerId=b.id 就能查询出有多少属下的上级是相同的,在对name进行分组

积累:

order by 注意事项

order by 要跟一个字段,是按照哪儿个字段进行排序

字段的长度计算

  • length()
select tweet_id from Tweets where length(content)>15

sql 中is null 的判断

select name from customer where referee_id<>2 or referee_id is null

group by 与order by

  • group by 分组,不加where 条件

  • order by 也不需要特意加where