SQL/solvesql Advent of SQL 2024

[SQL] solvesql Advent of SQL 2024 24일차

주댕이 2024. 12. 25. 01:37

# 링크

 

https://solvesql.com/collections/advent-of-sql-2024/

 

solvesql.com

 

https://solvesql.com/problems/friend-group-of-3/

 

solvesql.com

 

 

# 풀이

SELECT DISTINCT
  e1.user_a_id AS user_a_id,
  e1.user_b_id AS user_b_id,
  e2.user_b_id AS user_c_id
FROM
  edges e1
  JOIN edges e2 ON e1.user_b_id = e2.user_a_id
  JOIN edges e3 ON e2.user_b_id = e3.user_b_id
  AND e3.user_a_id = e1.user_a_id
WHERE
  3820 IN (e1.user_a_id, e1.user_b_id, e2.user_b_id)
  AND e1.user_a_id < e1.user_b_id
  AND e1.user_b_id < e2.user_b_id;
  • SELECT DISTINCT: 중복 데이터를 제외하고 데이터를 선택한다.
    • e1.user_a_id AS user_a_id: edges 테이블(e1)의 user_a_id 컬럼을 user_a_id로 저장한다.
    • e1.user_b_id AS user_b_id: edges 테이블(e2)의 user_b_id 컬럼을 user_b_id로 저장한다.
    • e2.user_b_id AS user_c_id: edges 테이블(e3)의 user_b_id 컬럼을 user_c_id로 저장한다.
  • FROM edges e1: edges 테이블의 별칭을 e1으로 설정하고, 해당 테이블에서 데이터를 가져온다.
    • JOIN edges e2 ON e1.user_b_id = e2.user_a_id: edges 테이블의 별칭을 e2로 설정하고, edges 테이블(e1)의 user_b_id 컬럼과 edges 테이블(e2)의 user_a_id 컬럼을 기준으로 두 테이블(e1, e2)을 JOIN 한다.
    • JOIN edges e3 ON e2.user_b_id = e3.user_b_id AND e3.user_a_id = e1.user_a_id: edges 테이블의 별칭을 e3으로 설정한 후, edges 테이블 두 개(e2, e3)의 user_b_id 컬럼과 edges 테이블 두 개(e3, e1)의 user_a_id 컬럼을 기준으로 두 테이블(e1+e2, e3)을 JOIN 한다.
  • WHERE
    • 3820 IN (e1.user_a_id, e1.user_b_id, e2.user_b_id): edges 테이블(e1)의 user_a_id, user_b_id,  edges 테이블(e2)의 user_b_id의 값 중 하나 이상이 3820을 포함하는 데이터만 선택한다.
    • AND e1.user_a_id < e1.user_b_id: edges 테이블(e1)의 user_a_id의 값이 edges 테이블(e1)의 user_b_id의 값보다 작은 데이터만 선택한다.
    • AND e1.user_b_id < e2.user_b_id: edges 테이블(e1)의 user_b_id의 값이 edges 테이블(e2)의 user_b_id의 값보다 작은 데이터만 선택한다.
728x90