力扣614-二级关注者

表:Follow

复制代码
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| followee    | varchar |
| follower    | varchar |
+-------------+---------+
(followee, follower) 是该表的主键(具有唯一值的列的组合)。
该表的每一行表示关注者关注了社交网络上的被关注者。
不会有用户关注他们自己。

二级关注者 是指满足以下条件的用户:

  • 关注至少一个用户,
  • 被至少一个用户关注。

编写一个解决方案来报告 二级用户 及其关注者的数量。

返回按 follower 字典序排序的结果表。

结果格式如下所示。

示例 1:

复制代码
输入:
Follow table:
+----------+----------+
| followee | follower |
+----------+----------+
| Alice    | Bob      |
| Bob      | Cena     |
| Bob      | Donald   |
| Donald   | Edward   |
+----------+----------+
输出:
+----------+-----+
| follower | num |
+----------+-----+
| Bob      | 2   |
| Donald   | 1   |
+----------+-----+
解释:
用户 Bob 有 2 个关注者。Bob 是二级关注者,因为他关注了 Alice,所以我们把他包括在结果表中。
用户 Donald 有 1 个关注者。Donald 是二级关注者,因为他关注了 Bob,所以我们把他包括在结果表中。
用户 Alice 有 1 个关注者。Alice 不是二级关注者,但是她不关注任何人,所以我们不把她包括在结果表中。

思路:

第一步,确定需要被统计的用户范围。用户是否"关注过别人"可以通过 follower 列判断,因此我们先从 Follow 表中取出所有出现过的 follower(去重后形成一个集合)。接着在原表中只保留那些 followee 落在该集合中的记录,这样筛出来的 followee 就是"既当过 follower 的用户",也就是题目要求的统计对象。

第二步,对筛选后的记录进行分组聚合。筛选条件执行后,表中剩下的每一行都表示"有人关注了某个符合条件的 followee"。因此只需要按 followee 分组,并对组内记录计数,得到该用户被关注的次数。计数时使用 COUNT(*) 更稳健,含义是统计关注关系记录的条数。

最后输出 followee 以及对应的关注次数即可。需要注意的是,SQL 中一个查询块只能有一个 GROUP BY 子句,因此只保留一次按 followee 分组即可;如果在 SELECT 中把 followee 起别名为 follower,也不意味着要再按 follower 分组,本质仍然是同一个字段。

代码:

sql 复制代码
select 
followee as follower,
count(follower) as num
from Follow
where followee in (select distinct follower from Follow)
group by followee
order by follower;

代码2:

sql 复制代码
select
  f.followee as follower,
  count(*) as num
from follow f
where exists (
  select 1
  from follow x
  where x.follower = f.followee
)
group by f.followee
order by f.followee;
相关推荐
诗词在线7 分钟前
求推荐飞花令
大数据·人工智能·python
湘美书院--湘美谈教育27 分钟前
湘美谈教育AI系列经验集锦:赋能整理聊斋志异大寓言
大数据·人工智能·深度学习·神经网络·机器学习
三十..28 分钟前
Redis 核心原理与高可用架构实践
运维·数据库·redis
这个DBA有点耶1 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构
jrjrgood1 小时前
现货黄金和黄金期货的区别有哪些?如何投资?
大数据·人工智能·区块链
努力努力再努力wz1 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
Theo·Chan1 小时前
机房断电搞崩服务器 | 人大金仓 V8 全量备份跨实例完整恢复实录
sql·信创·kingbase·金仓
JdSnE27zv1 小时前
Qt 操作SQLite数据库
数据库·qt·sqlite
tedcloud1232 小时前
HyperFrames部署教程:用HTML生成MP4视频
前端·数据库·人工智能·html·音视频
布朗克1682 小时前
25 IO流高级操作——序列化、NIO与Files工具类
java·数据库·io·nio