订阅更新

谁的好友最多:把双向关系展开成一列

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

LeetCode 602 · UNION ALL 展开双向关系、分组计数

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

面试怎么回答

好友是双向关系,我把 requester_id 和 accepter_id 用 UNION ALL 拼成一列,每出现一次就代表一个好友,再 GROUP BY 计数取最大。一定要 UNION ALL,用 UNION 会把重复出现去掉而少算。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

好友通过表每行是一对已成为好友的人(申请人、通过人)。找出好友数最多的人以及他的好友数。

表结构

  • request_accepted:requester_id、accepter_id、accept_date;同一对人只会出现一次

思路

好友关系是双向的:一行记录让两个人各多一个好友。把申请人一列和通过人一列用 UNION ALL 竖着拼成一列「用户」,再按用户计数,最大的那个就是答案。

参考解法

select rid as `id`,count(aid) as `num`
from
(
    select R1.requester_id as rid,R1.accepter_id as aid
    from request_accepted as R1
    UNION all
    select R2.accepter_id as rid,R2.requester_id as aid
    from request_accepted as R2
) as A
group by rid
order by num desc
limit 0,1

易错点

  • 用 UNION 会把同一个人在两边出现的记录去重,好友数被少算;必须用 UNION ALL。
  • 并列最多时 LIMIT 1 只返回一个,需要的话用 RANK 取第一名。
刷题进度保存在当前浏览器