如何用 SQL 找到最受欢迎的用户?
在社交网络或好友关系系统中,“最受欢迎的用户” 通常是拥有最多好友的人。如何通过 SQL 快速找到这样的用户呢?本文将通过一个简洁的 SQL 查询解决这个问题。
602. 好友申请 II :谁有最多的好友 - 力扣(LeetCode)
数据表结构
假设我们有一个好友请求记录表 RequestAccepted
,结构如下:
字段名 | 描述 |
---|---|
requester_id | 请求者用户 ID |
accepter_id | 接受者用户 ID |
每行数据表示一条好友请求被接受的记录。例如:
requester_id | accepter_id |
---|---|
1 | 2 |
1 | 3 |
2 | 3 |
目标
找到好友数量最多的用户,并返回其 ID 和好友数量。
解决方案
通过以下 SQL 查询实现:
WITH Friends AS (-- 合并所有用户的“好友关系”ID(包括请求者和接受者)SELECT requester_id AS idFROM RequestAcceptedUNION ALLSELECT accepter_id AS idFROM RequestAccepted
)
-- 统计每个用户的好友数量,并取最大值
SELECT id, COUNT(*) AS num
FROM Friends
GROUP BY id
ORDER BY num DESC
LIMIT 1;
分步解析
步骤 1:合并所有好友关系
使用 UNION ALL
将 请求者(requester_id
) 和 接受者(accepter_id
) 的 ID 合并到一个列表中:
SELECT requester_id AS id FROM RequestAccepted
UNION ALL
SELECT accepter_id AS id FROM RequestAccepted
-
UNION ALL
会保留重复记录(例如用户 1 多次添加好友)。 -
结果示例:
id 1 1 2 3
步骤 2:统计好友数量
按用户 ID 分组,统计每个用户的总出现次数(即好友数量):
SELECT id, COUNT(*) AS num
FROM Friends
GROUP BY id
-
COUNT(*)
统计每个用户出现的总次数。 -
结果示例:
id num 1 2 2 2 3 1
步骤 3:排序并取最大值
按好友数量降序排列,取第一名:
ORDER BY num DESC
LIMIT 1;
最终结果:
id | num |
---|---|
1 | 2 |
技术细节
-
为什么用
UNION ALL
而不是UNION
?-
UNION ALL
保留重复记录,确保正确统计所有好友关系。 -
UNION
会去重,导致计数不准确。
-
-
LIMIT 1
的注意事项-
如果有多个用户并列第一,此查询只会返回其中一个。
-
若需要返回所有并列用户,可移除
LIMIT
并在应用层处理。
-
总结
通过 合并请求方和接受方的用户 ID 并统计出现次数,我们能够快速找到最受欢迎的用户。