订阅更新

二级关注者:既被人关注、又去关注别人的用户

SQL 实战 123 题 · 第 40 题 中等 约 2 分钟读完

LeetCode 614 · 自关联、IN 子查询、去重计数

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

先找出出现在 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 起别名。
刷题进度保存在当前浏览器