
👉 문제 바로가기 : solvesql - Advent of SQL 2024 DAY 24
저작권 문제로 링크만 첨부한다.
논리적 관계를 join을 통해 풀 수 있어야한다.
프로그래머스의 PCSQL로 치면 3번에 나올 법한 문제이다.
논리를 sql로 풀어내야 하는데, 이에 익숙하지 않다면 풀기가 어려우니 여러 문제를 해결해볼 필요가 있다.
SELECT
A.user_a_id "user_a_id"
, B.user_a_id "user_b_id"
, B.user_b_id "user_c_id"
FROM
edges A
JOIN edges B ON A.user_b_id = B.user_a_id -- step 1 : user1-user2-user3 를 연결
JOIN edges C ON A.user_a_id = C.user_a_id AND B.user_b_id = C.user_b_id -- step 2 : user3과 user1이 친구인지
WHERE
-- step 3 : 3820 유저가 포함된 관계만
A.user_a_id = 3820
OR B.user_a_id = 3820
OR B.user_b_id = 3820
;
edges A JOIN edges B ON A.user_b_id = B.user_a_id

JOIN edges C ON A.user_a_id = C.user_a_id --AND B.user_b_id = C.user_b_id
user1과 user3이 친구인지 판단하기 위해 셀프조인을 다시한다.
C.user_b_id에는 user1의 친구들이 손실 없이 존재한다.

JOIN edges C ON A.user_a_id = C.user_a_id AND B.user_b_id = C.user_b_id

WHERE
A.user_a_id = 3820
OR B.user_a_id = 3820
OR B.user_b_id = 3820
이제 남은 데이터들은 모두 친구관계이다. 3820유저가 포함된 관계만 출력한다.