谁的好友最多:把双向关系展开成一列
LeetCode 602 · UNION ALL 展开双向关系、分组计数
面试怎么回答
好友是双向关系,我把 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 取第一名。