如何用 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 查询实现:

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

技术细节

  1. 为什么用 UNION ALL 而不是 UNION

    • UNION ALL 保留重复记录,确保正确统计所有好友关系。

    • UNION 会去重,导致计数不准确。

  2. LIMIT 1 的注意事项

    • 如果有多个用户并列第一,此查询只会返回其中一个。

    • 若需要返回所有并列用户,可移除 LIMIT 并在应用层处理。

总结

通过 合并请求方和接受方的用户 ID 并统计出现次数,我们能够快速找到最受欢迎的用户。

相关推荐
qq_246839759 分钟前
postgresql xxhash64 哈希函数实现
数据库·postgresql·哈希算法
希望奇迹很安静10 分钟前
等级保护测评
网络·数据库
会博通·代码搬运工21 分钟前
疾控档案落地难点:异构业务系统并存,高价值纸质凭证如何回流业务闭环
数据库·档案管理·档案管理系统·智能扫描设备·会博通
数智启示录23 分钟前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录29 分钟前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
Java小白笔记31 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
—Miss. Z—32 分钟前
计算机三级数据库技术—填空题
数据库·mysql
润乾软件1 小时前
SQLazy:从事件表中查出下一组的开始时刻
sql·sqlazy
数智启示录1 小时前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
烬羽1 小时前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent