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