今天再写数据库题的时候遇到了一个题目是:
链接:https://leetcode-cn.com/problems/find-the-team-size
编写一个 SQL 查询,以求得每个员工所在团队的总人数。
表是:
+-------------+------------+
| employee_id | team_id |
+-------------+------------+
| 1 | 8 |
| 2 | 8 |
| 3 | 8 |
| 4 | 7 |
| 5 | 9 |
| 6 | 9 |
+-------------+------------+
查询结果是:
+-------------+------------+
| employee_id | team_size |
+-------------+------------+
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
| 4 | 1 |
| 5 | 2 |
| 6 | 2 |
+-------------+------------+
博主还是在本科的时候学的数据库,诗歌久远忘的已经差不多了,然后就写了以下的语句:
select employee_id , count(team_id) team_size
from Employee
group by team_id;
看起来自我感觉良好,一运行,这是错的呀,运行结果如下:
{"headers": ["employee_id", "team_size"], "values": [[4, 1], [1, 3], [5, 2]]}
转化为表格就是:
+-------------+------------+
| employee_id | team_size |
+-------------+------------+
| 4 | 1 |
| 1 | 3 |
| 5 | 2 |
+-------------+------------+
这使我陷入了沉思这样写出来的结果是不对的,原因推测如下,我们`
group by team_id
这样的话我们只能够得到和team_id的种类个数相等的记录数,即:我们只能得到3条记录,这楼主才明白,于是乎我们可以在以上的结果上再对原始的表进行一个连接,俩表是以team_id作为连接依据的,我们先对之前的SQL语句进行一下修改:
select team_id , count(*) team_size
from Employee
group by team_id
得到了由team_id和team_size组成的表,然后我们再使用原始的表与改改我们得到的表进行一个左连接,语句如下:
select e.employee_id,s.team_size
from Employee e
left join
(
select team_id , count(*) team_size
from Employee
group by team_id
) s
on e.team_id=s.team_id;
就可以啦!!!