22. 친구 수 집계하기

2024-12-24

with user_a_counts as (
	SELECT
	user_a_id AS user_id,
	COUNT(DISTINCT user_b_id) AS friend_count
	FROM edges
	GROUP BY user_a_id
),
user_b_counts as (
	SELECT
	user_b_id AS user_id,
	COUNT(DISTINCT user_a_id) AS friend_count
	FROM edges
	GROUP BY user_b_id
)
SELECT
	u.user_id
	, coalesce(a.friend_count, 0) + coalesce(b.friend_count, 0) num_friends
FROM users u
left join user_a_counts a on a.user_id = u.user_id
left join user_b_counts b on b.user_id = u.user_id
group by u.user_id
order by num_friends desc, u.user_id asc

처음에는 단순하게 edges 내부에서 UNION ALL 걸어버리면 안되나,,, 라고 해서 제출했는데 오답이어서 다시 보니...친구가 아예 없는 사용자가 있다는 생각을 아예 못했던 것 ...

users 테이블과 edges를 조인할때도 처음에는 단순하게 OR로 LEFT JOIN 걸어버리자 ... 해서 쿼리 작성했다가 실행시간이 말도 안되게 오래걸려서(당연함) 결국은 a와 b의 카운트를 각각 구해서 더하는 방법으로 구현했다