在社交网络或好友关系系统中,"最受欢迎的用户" 通常是拥有最多好友的人。如何通过 SQL 快速找到这样的用户呢?本文将通过一个简洁的 SQL 查询解决这个问题。
602. 好友申请 II :谁有最多的好友 - 力扣(LeetCode)

数据表结构
假设我们有一个好友请求记录表 RequestAccepted,结构如下:
| 字段名 | 描述 | 
|---|---|
requester_id | 
请求者用户 ID | 
accepter_id | 
接受者用户 ID | 
每行数据表示一条好友请求被接受的记录。例如:
| requester_id | accepter_id | 
|---|---|
| 1 | 2 | 
| 1 | 3 | 
| 2 | 3 | 
目标
找到好友数量最多的用户,并返回其 ID 和好友数量。
解决方案
通过以下 SQL 查询实现:
            
            
              sql
              
              
            
          
          WITH Friends AS (
    -- 合并所有用户的"好友关系"ID(包括请求者和接受者)
    SELECT requester_id AS id
    FROM RequestAccepted
    UNION ALL
    SELECT accepter_id AS id
    FROM 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 合并到一个列表中:
            
            
              sql
              
              
            
          
          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 分组,统计每个用户的总出现次数(即好友数量):
            
            
              sql
              
              
            
          
          SELECT id, COUNT(*) AS num
FROM Friends
GROUP BY id
        - 
COUNT(*)统计每个用户出现的总次数。 - 
结果示例:
id num 1 2 2 2 3 1  
步骤 3:排序并取最大值
按好友数量降序排列,取第一名:
            
            
              sql
              
              
            
          
          ORDER BY num DESC
LIMIT 1;
        最终结果:
| id | num | 
|---|---|
| 1 | 2 | 
技术细节
- 
为什么用
UNION ALL而不是UNION?- 
UNION ALL保留重复记录,确保正确统计所有好友关系。 - 
UNION会去重,导致计数不准确。 
 - 
 - 
LIMIT 1的注意事项- 
如果有多个用户并列第一,此查询只会返回其中一个。
 - 
若需要返回所有并列用户,可移除
LIMIT并在应用层处理。 
 - 
 
总结
通过 合并请求方和接受方的用户 ID 并统计出现次数,我们能够快速找到最受欢迎的用户。