본문 바로가기
SQL

[solvesql - day 22] 친구 수 집계하기

by 우솨 2025. 1. 11.

https://solvesql.com/problems/number-of-friends/

 

https://solvesql.com/problems/number-of-friends/

 

solvesql.com

-- 사용자의 친구 수를 계산하는 쿼리
-- 각 사용자가 연결된 다른 사용자의 수를 합산하여 해당 사용자의 총 친구 수를 계산

WITH cte1 AS (
    -- 사용자(user_id)가 다른 사용자(user_b_id)와 연결된 경우의 친구 수를 계산
    SELECT 
        user_id,                           -- 사용자 ID
        COUNT(user_a_id) AS cnt1           -- 해당 사용자가 연결된 다른 사용자(user_a_id)의 수
    FROM users
    LEFT JOIN edges
        ON users.user_id = edges.user_b_id  -- 'user_b_id'는 친구 관계의 대상
    GROUP BY user_id  -- 사용자별로 그룹화하여 친구 수 집계
),

cte2 AS (
    -- 사용자(user_id)가 다른 사용자(user_a_id)와 연결된 경우의 친구 수를 계산
    SELECT 
        user_id,                           -- 사용자 ID
        COUNT(user_b_id) AS cnt2           -- 해당 사용자가 연결된 다른 사용자(user_b_id)의 수
    FROM users
    LEFT JOIN edges
        ON users.user_id = edges.user_a_id  -- 'user_a_id'는 친구 관계의 대상
    GROUP BY user_id  -- 사용자별로 그룹화하여 친구 수 집계
)

-- 최종적으로 각 사용자의 총 친구 수 계산
SELECT 
    cte1.user_id,                          -- 사용자 ID
    cnt1 + cnt2 AS num_friends             -- 친구 수 합산 (친구 수는 양방향 관계이므로 두 개의 카운트를 합침)
FROM cte1
LEFT JOIN cte2
    ON cte1.user_id = cte2.user_id         -- 두 개의 CTE를 사용자 ID를 기준으로 조인
ORDER BY 
    num_friends DESC,                      -- 친구 수가 많은 사용자부터 정렬
    cte1.user_id                           -- 친구 수가 같은 경우 사용자 ID로 정렬