[solvesql - day 24] lv4 세 명이 서로 친구인 관계 찾기

데프·2024년 12월 24일
post-thumbnail

👉 문제 바로가기 : 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
;

답안 설명

# Step 1

edges A JOIN edges B ON A.user_b_id = B.user_a_id 
  • self join으로 user1-user2-user3을 연결한다.
    • user1 = A.user_a_id
    • user2 = A.user_b_id, B.user_a_id
    • user3 = B.user_b_id
  • 이 때 user1과 user2는 반드시 친구지만, user1과 user3은 친구인지 확실하지 않다.

# Step 2-1

JOIN edges C ON A.user_a_id = C.user_a_id --AND B.user_b_id = C.user_b_id
  • user1과 user3이 친구인지 판단하기 위해 셀프조인을 다시한다.

    • user1 = A.user_a_id, C.user_a_id
    • user2 = A.user_b_id, B.user_a_id
    • user3 = B.user_b_id
  • C.user_b_id에는 user1의 친구들이 손실 없이 존재한다.


# Step 2-2

  JOIN edges C ON A.user_a_id = C.user_a_id AND B.user_b_id = C.user_b_id
  • 이제 유저3을 C.user_b_id와 비교하여 유저3과 유저1이 친구인지 판단한다.


# Step 3

WHERE
  A.user_a_id = 3820
  OR B.user_a_id = 3820
  OR B.user_b_id = 3820

이제 남은 데이터들은 모두 친구관계이다. 3820유저가 포함된 관계만 출력한다.

profile
정보의 홍수를 기록하는 데프의 로그

0개의 댓글