二级关注者:既被人关注、又去关注别人的用户
LeetCode 614 · 自关联、IN 子查询、去重计数
面试怎么回答
先找出出现在 follower 列里的用户,这些人才算二级关注者;再把 followee 限定在这个集合里,按 followee 分组 COUNT(DISTINCT follower)。原始数据有重复关注,去重计数是这道题的细节。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
关注表每行是「被关注者、关注者」一对关系。所谓二级关注者,是指自己也关注了别人(出现在关注者一列)的用户。统计每个二级关注者有多少个不同的人关注他,按用户名字典序输出。
表结构
- follow:followee(被关注者)、follower(关注者);可能有重复记录
思路
先确定谁是二级关注者:在 follower 列里出现过的用户。再看这些用户作为被关注者时,有多少个不同的关注者。把被关注者限制在「关注者集合」里,按被关注者分组 COUNT(DISTINCT follower) 即可。
参考解法
select followee follower,count(distinct follower) num
from follow
where followee in (
select follower
from follow
group by follower
)
group by followee
order by follower
另一种写法:自连接写法:被关注者同时出现在关注者一侧
SELECT f1.followee AS follower, COUNT(DISTINCT f1.follower) AS num
FROM follow f1
JOIN (SELECT DISTINCT follower FROM follow) f2 ON f1.followee = f2.follower
GROUP BY f1.followee
ORDER BY f1.followee
易错点
- 数据里有重复的关注记录,必须 COUNT(DISTINCT follower)。
- 输出列名要求是 follower,注意把 followee 起别名。