03/07 SQL 문제풀이 - 602. Friend Requests II: Who Has the Most Friends (Leetcode) ⭐⭐⭐

Data Architect / Engineer·2024년 3월 7일
1

1일_1SQL

목록 보기
48/63
post-thumbnail

문제

  • LeetCode SQL 문제
  • 602. Friend Requests II: Who Has the Most Friends / Medium
  • 문제 내용 : [링크]


내가 작성한 Query

with temp_01 as(
    select accepter_id as id
        , count(*) as num1
    from requestaccepted
    group by accepter_id
),
temp_02 as(
    select requester_id as id
    , count(*) as num2
    from requestaccepted
    group by requester_id
)
(select a.id, coalesce(num1, 0)+coalesce(num2, 0) as num
from temp_01 a
    left join temp_02 b on a.id = b.id)
union
(select a.id, coalesce(num1, 0)+coalesce(num2, 0) as num
from temp_02 a
    left join temp_01 b on a.id = b.id)
order by num desc
limit 1
  • 친구가 가장 많은 사람의 id와 친구 수num을 구하는 문제이다.

  • 먼저 친구 요청을 '받은' 사람들의 데이터를 구하자. temp_01 테이블에 accepter_id 기준으로 GROUP BY를 통해 count(*)를 구해준 데이터를 저장한다. 이 데이터 개수를 num1로 저장한다.

  • 이후 친구 요청을 '보낸' 사람들의 데이터를 구하자. temp_02 테이블에 requester_id 기준으로 GROUP BY를 통해 count(*)를 구해준 데이터를 저장한다. 이 데이터 개수를 num2로 저장한다.

  • 두 데이터를 OUTER JOIN 해 준다.

(⭐⭐⭐ 왜 OUTER JOIN 해 주어야하나? : temp_01, temp_02에 각각 데이터가 없는 경우가 있을 수 있다. 즉 친구 요청을 '받은 사람만' 존재할 수 있고, 친구 요청을 '보낸 사람만' 존재할 수 있다.)

  • MYSQL은 OUTER JOIN이 없으므로, 두 테이블을 temp_01', 'temp_02 기준으로 LEFT JOIN 한 후 UNION 해 준다.

  • 이 때 coalesce 함수를 사용하여 num1, num2 데이터가 없는 경우 null대신 0을 대입해준다. (null 값은 집계함수에서 최대한 사용을 지양하는것이 좋다)

  • 최대 친구수를 가지는 데이터를 출력해야하므로 num1 + num2의 값을 가지는 num 기준으로 ORDER BY 내림차순 정렬해준다.

  • 최대값 데이터 1개만 출력하므로 LIMIT 1 해 준다.


Follow up : 최대값 데이터가 2개 이상인 경우, 어떻게??

  • ORDER BY 이후 LIMIT 1 하지 않고, 서브쿼리를 통해 WHERE절에 num 값이 max(num) 값을 가지도록 구현해준다.

profile
질문은 계속돼 아오에

0개의 댓글