前言
练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
今日题目:
602.好友申请II:谁有最多的好友
表:RequestAccepted
列名 | 类型 |
---|---|
requester_id | int |
accepter_id | int |
accept_date | date |
(requester_id, accepter_id) 是这张表的主键(具有唯一值的列的组合)。
这张表包含发送好友请求的人的 ID ,接收好友请求的人的 ID ,以及好友请求通过的日期。
编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。生成的测试用例保证拥有最多好友数目的只有 1 个人。
进阶:在真实世界里,可能会有多个人拥有好友数相同且最多,你能找到所有这些人吗?
我那不值一提的想法:
- 首先梳理表内容,题干一共给了一张请求表,记录了发送请求id,接受者id,接受日期
- 其次分析需求,需要找到拥有最多好友的人和他拥有的好友数量
- 首先查好友数量,通过这个表我们可以观察到,好友的数量=requester_id的数量+accepter_id的数量,这里我们可以通过别查询requester_id的数量和accpter_id的数量
- 然后再使用union all 连接所有的结果,就能得到用户接受好友的数量,以及用户被接受好友的数量
- 最后再将结果建立成临时表,从临时表里面查询结果。
select requester_id as id,sum(num) as num
from
(select requester_id,count(requester_id) as numfrom RequestAcceptedgroup by requester_idunion allselect accepter_id,count(accepter_id) as num from RequestAcceptedgroup by accepter_id
) as a
group by requester_id
order by num desc
limit 1
对于进阶版来说,就是可能会有多种情况,我觉得最简单的方法就是再加一层嵌套,然后去掉limit1,将好友数量的所有结果保存到一张临时表中,然后嵌套查询,条件就是where num =
(select max(num) from 临时表)
with temp as (select requester_id as id,sum(num) as num from (select requester_id,count(requester_id) as numfrom RequestAcceptedgroup by requester_idunion allselect accepter_id,count(accepter_id) as num from RequestAcceptedgroup by accepter_id) as a group by requester_idorder by num desc
)
select id,num
from temp
where num = (select max(num) from temp)
结果:
总结:
能运行就行。