์์ฉ์ธ์ด : MYSQL
LEVEL : 5
๋ฌธ์ : ๋ฉธ์ข ์๊ธฐ์ ๋์ฅ๊ท ์ฐพ๊ธฐ
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ํ์ด
WITH RECURSIVE generations AS (
SELECT id,
COALESCE(parent_id, 0) AS parent_id,
1 AS generation
FROM ECOLI_DATA
WHERE parent_id IS NULL
UNION ALL
SELECT
E.id,
E.parent_id,
G.generation + 1 AS generation
FROM ECOLI_DATA E
JOIN generations G
ON E.parent_id = G.id
)
SELECT
COUNT(*) AS count,
G.generation AS generation
FROM generations G
LEFT JOIN ECOLI_DATA E
ON G.id = E.parent_id
WHERE E.id IS NULL
GROUP BY G.generation
ORDER BY G.generation;
- ์์์ด ์๋ ๊ฐ์ฒด์ ์๋ฅผ ๊ฐ ์ธ๋๋ณ๋ก ๊ณ์ฐํ๊ธฐ ์ํด์๋ ECOLI_DATA ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ์ธ๋๋ณ๋ก ๊ทธ๋ฃนํ ํ ๋ค, ๊ฐ ๊ทธ๋ฃน์์ ์์์ด ์๋ ๊ฐ์ฒด์ ์๋ฅผ ์ธ์ด์ผ ํ๋ค.
- ๋ํ ๊ฐ ๊ฐ์ฒด์ ์ธ๋๋ ๋ถ๋ชจ ๊ฐ์ฒด์ ์ธ๋๋ณด๋ค 1๋งํผ ๋์์ผํ๋ค.(์ด๊ธฐ ๊ฐ์ฒด์ ์ธ๋๋ 1)
<๊ฐ ๊ฐ์ฒด์ ์ธ๋๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ>
- ๊ฐ ๊ฐ์ฒด๊ฐ ์ด๋ ์ธ๋์ ์ํ๋์ง๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์๋ ์ฌ๊ท์ ์กฐ์ธ์ ์ฌ์ฉํด์ ๊ฐ ๊ฐ์ฒด์ ๋ถ๋ชจ ์์ ๊ด๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ธ๋๋ฅผ ๊ณ์ฐํด์ผํ๋ค. (WITH RECURSIVE๋ฌธ ์ฌ์ฉ)
์ฐธ๊ณ - Inpa DeV
1. ์กฐ๊ฑด ์ค์
- SELECT ์ ์์๋ id, COALESCE(parent_id, 0) AS parent_id, 1 AS generation์ ์ ํํ๋ค. (์ด๊ธฐ ๊ฐ์ฒด๋ค์ ์ธ๋๋ 1๋ก ์ค์ )
- WHERE ์ ์์๋ parent_id IS NULL ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ ์๋(์ฆ, parent_id๊ฐ NULL์ธ) ์ด๊ธฐ ๊ฐ์ฒด๋ค์ ์ ํํ๋ค.
- ์ด๊ธฐ ๊ฐ์ฒด๋ค์ ์ธ๋์ ์์์ ์ด๋ฏ๋ก generation์ 1๋ก ์ค์
2. ์ฌ๊ท ๋จ๊ณ
- UNION ALL์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ์กฐ๊ฑด๊ณผ ์ฌ๊ท์ ์ผ๋ก ์กฐ์ธ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ฅ
- JOIN์ ์ฌ์ฉํ์ฌ ECOLI_DATA๊ณผ generations CTE๋ฅผ ์กฐ์ธ (์์ ๊ฐ์ฒด์ parent_id์ ๋ถ๋ชจ ๊ฐ์ฒด์ id)
*CTE( Common Table Expressions): ๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ผ์์ ์ธ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก, ์ฟผ๋ฆฌ ์คํ ์ ํ๋ฒ ์ ์๋๋ค.
- ์กฐ์ธ๋ ๊ฒฐ๊ณผ๋ฅผ ํตํด ๋ถ๋ชจ ๊ฐ์ฒด์ generation์ 1์ ๋ํด ์์ ๊ฐ์ฒด์ generation์ ๊ณ์ฐ
3. ์ข ๋ฃ
- ๋ ์ด์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ท ์กฐ์ธ์ด ์ข ๋ฃ
<์์์ด ์๋ ๊ฐ์ฒด ์ฐพ๋ ๋ฐฉ๋ฒ>
- ์์์ด ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ LEFT JOIN์ ํตํด ์๋ณํ ์ ์๋ค.
1. ์์์ด ์๋ ๊ฐ์ฒด ์๋ณ
- LEFT JOIN์ ์ฌ์ฉํ์ฌ ECOLI_DATA ํ ์ด๋ธ์ ์กฐ์ธ(๊ฐ ๊ฐ์ฒด์ ID๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ PARENT_ID์ ์ผ์นํ๋์ง ํ์ธ)
- LEFT JOIN์ ํตํด ๋ถ๋ชจ ๊ฐ์ฒด์ ID์ ์์ํ๋ ์์ ๊ฐ์ฒด์ ID๊ฐ ์กด์ฌํ์ง ์๋๊ฒฝ์ฐ NULL๋ก ํ์๋๋๋ฐ, ์ด๋ ์์์ด ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
2. ์๋๋ณ ๊ทธ๋ฃนํ / ๊ณ์ฐ
- ์์์ ์์์ด ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ ๋ค GROUP BY๋ฅผ ํตํด ์ธ๋๋ณ๋ก ๊ทธ๋ฃนํ
- ๊ฐ ๊ทธ๋ฃน์์ COUNT(*)๋ฅผ ์ฌ์ฉํด ์์์ด ์๋ ๊ฐ์ฒด์ ์๋ฅผ ๊ณ์ฐ
3. ์ต์ข ์ ๋ ฌ
- GROUP BY๋ฅผ ์ฌ์ฉํด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
ํ๊ธฐ
- ์ฌ๊ท ํจ์์ ๋ํ ์ดํด๊ฐ ํ์ํ ๋ฌธ์ ์๋ค.
๋๊ธ