前言
練習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)
結果:
總結:
能運行就行。