๐Ÿ–ฅ๏ธ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [SQL] ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์•„์ดํ…œ ๊ตฌํ•˜๊ธฐ

rtw0202 2026. 3. 9. 20:16

1. ๋ฌธ์ œ ์„ค๋ช…

์–ด๋А ํ•œ ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•„์ดํ…œ๋“ค์€ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 'ITEM_A'->'ITEM_B'์™€ ๊ฐ™์ด ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ 'ITEM_A'๋ฅผ 'ITEM_B' ์˜ PARENT ์•„์ดํ…œ, PARENT ์•„์ดํ…œ์ด ์—†๋Š” ์•„์ดํ…œ์„ ROOT ์•„์ดํ…œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 'ITEM_A'->'ITEM_B'->'ITEM_C'์™€ ๊ฐ™์ด ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์•„์ดํ…œ์ด ์žˆ๋‹ค๋ฉด 'ITEM_C'์˜ PARENT ์•„์ดํ…œ์€ 'ITEM_B'
'ITEM_B'์˜ PARENT ์•„์ดํ…œ์€ 'ITEM_A' ROOT ์•„์ดํ…œ์€ 'ITEM_A'๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ•ด๋‹น ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•„์ดํ…œ ์ •๋ณด๋ฅผ ๋‹ด์€ ITEM_INFO ํ…Œ์ด๋ธ”๊ณผ ์•„์ดํ…œ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ ITEM_TREE ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ITEM_INFO ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, ITEM_ID, ITEM_NAME, RARITY, PRICE๋Š” ๊ฐ๊ฐ ์•„์ดํ…œ ID, ์•„์ดํ…œ ๋ช…, ์•„์ดํ…œ์˜ ํฌ๊ท€๋„, ์•„์ดํ…œ์˜ ๊ฐ€๊ฒฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ITEM_TREE ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, ITEM_IDPARENT_ITEM_ID๋Š” ๊ฐ๊ฐ ์•„์ดํ…œ ID, PARENT ์•„์ดํ…œ์˜ ID๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹จ, ๊ฐ ์•„์ดํ…œ๋“ค์€ ์˜ค์ง ํ•˜๋‚˜์˜ PARENT ์•„์ดํ…œ ID๋ฅผ ๊ฐ€์ง€๋ฉฐ, ROOT ์•„์ดํ…œ์˜ PARENT ์•„์ดํ…œ ID๋Š” NULL ์ž…๋‹ˆ๋‹ค.

ROOT ์•„์ดํ…œ์ด ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ดํ…œ์˜ ํฌ๊ท€๋„๊ฐ€ 'RARE'์ธ ์•„์ดํ…œ๋“ค์˜ ๋ชจ๋“  ๋‹ค์Œ ์—…๊ทธ๋ ˆ์ด๋“œ ์•„์ดํ…œ์˜ ์•„์ดํ…œ ID(ITEM_ID), ์•„์ดํ…œ ๋ช…(ITEM_NAME), ์•„์ดํ…œ์˜ ํฌ๊ท€๋„(RARITY)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL ๋ฌธ์„ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์•„์ดํ…œ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์ฃผ์„ธ์š”.


2. ์ถœ๋ ฅ ์˜ˆ์‹œ

 
3. ๋ฌธ์ œ ๋‹ต์•ˆ

SELECT
    t.item_id, # ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅํ•œ ์•„์ดํ…œ์˜ ๋‹ค์Œ ์•„์ดํ…œ
    i.item_name,
    i.rarity
FROM item_info i
JOIN item_tree t
ON i.item_id = t.item_id
WHERE t.parent_item_id IN (SELECT # ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅ
                             item_id
                           FROM item_info
                           WHERE rarity = 'RARE') # ํฌ๊ท€๋„๊ฐ€ RARE์ธ ์•„์ดํ…œ์˜ id (0, 1, 3, 4)
ORDER BY t.item_id DESC;