题目描述
(通过次数16,083 | 提交次数19,497,通过率82.49%)
员工表:Employee +---------------+---------+ | Column Name | Type | +---------------+---------+ | employee_id | int | | team_id | int | +---------------+---------+ employee_id 字段是这张表的主键,表中的每一行都包含每个员工的 ID 和他们所属的团队。 编写一个 SQL 查询,以求得每个员工所在团队的总人数。 查询结果中的顺序无特定要求。 查询结果格式示例如下: Employee Table: +-------------+------------+ | employee_id | team_id | +-------------+------------+ | 1 | 8 | | 2 | 8 | | 3 | 8 | | 4 | 7 | | 5 | 9 | | 6 | 9 | +-------------+------------+ Result table: +-------------+------------+ | employee_id | team_size | +-------------+------------+ | 1 | 3 | | 2 | 3 | | 3 | 3 | | 4 | 1 | | 5 | 2 | | 6 | 2 | +-------------+------------+ ID 为 1、2、3 的员工是 team_id 为 8 的团队的成员, ID 为 4 的员工是 team_id 为 7 的团队的成员, ID 为 5、6 的员工是 team_id 为 9 的团队的成员。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-the-team-size
--测试数据 Create table If Not Exists Employee (employee_id int, team_id int); insert into Employee (employee_id, team_id) values ('1', '8'); insert into Employee (employee_id, team_id) values ('2', '8'); insert into Employee (employee_id, team_id) values ('3', '8'); insert into Employee (employee_id, team_id) values ('4', '7'); insert into Employee (employee_id, team_id) values ('5', '9'); insert into Employee (employee_id, team_id) values ('6', '9');
解题思路
这道题用到的概念还蛮多的:自关联、笛卡尔积、聚合函数、子查询。
记得之前有个同事,一直理解不了自关联是什么意思。
其实,自关联就是自己跟自己关联。如果你也理解不了,不妨把自己叫做a表,再复制一个自己,叫做b表,然后a表与b表关联,这样就是两张不同的表关联,就好理解了。区别就是这两张表是一模一样的。
具体到这道题,因为来源表员工表的主键是employee_id,而结果的主键也是employee_id,并且是所有员工的数据都要有。那么说明源表与结果表的主键是一致的。
最简单的思路,就是直接查询Employee表,而且还不需要加条件。这样就能返回所有要求返回的员工记录。至于要求返回的第2个字段team_size,想办法inner join或者left join上去就可以了。
那么team_size怎么获取呢?直接使用group by对team_id分组,然后取每个分组内的员工数即可。
当然,这样就需要使用到子查询,先计算出每个team的team_size。
可不可以不使用子查询呢?
其实,对于team_size,也可以从每个员工的team_id出发,关联出这个team_id下所有的员工,然后使用employee_id做分组汇总,取出分组下的数据条数即可。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
--方法1 select a.employee_id, b.team_size from employee a inner join ( select team_id, count(1) team_size from employee group by team_id )b on a.team_id = b.team_id; --方法2 select a.employee_id, count(1) team_size from employee a inner join employee b on a.team_id = b.team_id group by a.employee_id;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。