# 링크
- solvesql Advent of SQL 2024: https://solvesql.com/collections/advent-of-sql-2024/
- 24일차 - 세 명이 서로 친구인 관계 찾기:https://solvesql.com/problems/friend-group-of-3/
# 풀이
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
'SQL > solvesql Advent of SQL 2024' 카테고리의 다른 글
[SQL] solvesql Advent of SQL 2024 25일차 (2) | 2024.12.26 |
---|---|
[SQL] solvesql Advent of SQL 2024 23일차 (0) | 2024.12.25 |
[SQL] solvesql Advent of SQL 2024 22일차 (0) | 2024.12.24 |
[SQL] solvesql Advent of SQL 2024 21일차 (0) | 2024.12.22 |
[SQL] solvesql Advent of SQL 2024 20일차 (0) | 2024.12.21 |