문제
- 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)
값을 가지도록 구현해준다.