본문 바로가기

코딩일기

SQL 코드카타 117 - Friend Requests II: Who Has the Most Friends

https://leetcode.com/problems/friend-requests-ii-who-has-the-most-friends/

 

Column Nmae Type
requester_id int
accepter_id int
accept_date date

 

RequestAccepted 테이블:

  • requester_id : 테이블의 고유 키, 요청받은 사용자의 id
  • accepter_id : 테이블의 고유 키, 요청한 사용자의 id
  • accept_date : 요청이 수락된 날짜

가장 많은 친구를 가진 사람과 그 친구 수를 찾는 해결책을 작성하세요.

테스트 케이스는 오직 한 사람만이 가장 많은 친구를 가지도록 생성됩니다.

결과 형식은 다음 예시와 같습니다.

 

친구의 수는 친구신청을 한 횟수 + 친구신청을 받은 횟수이므로 두 경우를 구해서 서로 더해주면 된다.

 

select
    requester_id,
    count(requester_id)
from RequestAccepted
group by requester_id

 

먼저 유저별로 친구신청을 보낸 횟수를 구해준다.

 

select
    accepter_id,
    count(accepter_id) accept
from RequestAccepted
group by accepter_id

 

다음으로 유저별로 친구신청을 받은 횟수를 구해준다.

 

(select
    requester_id id,
    count(requester_id) request
from RequestAccepted
group by requester_id)

union all

(select
    accepter_id id,
    count(accepter_id) accept
from RequestAccepted
group by accepter_id)

 

두 쿼리를 union all로 결합한다.

 

select
    id,
    sum(request) num
from
((select
    requester_id id,
    count(requester_id) request
from RequestAccepted
group by requester_id)

union all

(select
    accepter_id id,
    count(accepter_id) accept
from RequestAccepted
group by accepter_id)) a
group by id

 

해당 쿼리를 서브쿼리로 바꾼 뒤, id별로 합계를 출력한다.

 

select
    id,
    sum(request) num
from
((select
    requester_id id,
    count(requester_id) request
from RequestAccepted
group by requester_id)

union all

(select
    accepter_id id,
    count(accepter_id) accept
from RequestAccepted
group by accepter_id)) a
group by id
order by num DESC
limit 1

 

요청이 많은 순서대로 내림차순 정렬해서 가장 위의 행만 출력하면 완료!

완료!