본문 바로가기
MYSQL/프로그래머스 LV02

업그레이드 된 아이템 구하기

by 수스리 2025. 2. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/273711

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

이 문제도 어려웠다. 여태 문제 중 가장 해맨 문제가 아닌가 한다. 결국 답지를 봤고 GPT 도움도 좀 받았다. 

더보기

SELECT   INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_TREE TREE
JOIN ITEM_INFO PARENT_INFO ON TREE.PARENT_ITEM_ID = PARENT_INFO.ITEM_ID
JOIN ITEM_INFO INFO ON TREE.ITEM_ID = INFO.ITEM_ID
WHERE PARENT_INFO.RARITY = "RARE"
ORDER BY INFO.ITEM_ID DESC;

우선 단계적으로 가 보자.

1.단계

더보기

SELECT *
FROM ITEM_TREE TREE
JOIN ITEM_INFO PARENT_INFO ON TREE.PARENT_ITEM_ID = PARENT_INFO.ITEM_ID

걸과

ITEM_ID PARENT_ITEM_ID ITEM_ID ITEM_NAME RARITY PRICE
1 0 0 ITEM_A RARE 10000
2 0 0 ITEM_A RARE 10000
3 1 1 ITEM_B RARE 9000
4 1 1 ITEM_B RARE 9000

SELF JOIN을 했다. SELF JOIN은 이전에도 써 본적이 있다. 여기서 기존 아이템과 부모 아이템의 정보를 출력하도록 JOIN했다. 기존에 있는 TREE의 PARENT_ITEM_ID와 맞는 ITEM_INFO의 ITEM_ID를 이어 붙이면 부모 아이템의 정보만 출력 된다. 

2.단계

더보기

SELECT *
FROM ITEM_TREE TREE
JOIN ITEM_INFO PARENT_INFO ON TREE.PARENT_ITEM_ID = PARENT_INFO.ITEM_ID
JOIN ITEM_INFO INFO ON TREE.ITEM_ID = INFO.ITEM_ID

결과

ITEM_ID PARENT_ITEM_ID ITEM_ID ITEM_NAME RARITY PRICE ITEM_ID ITEM_NAME RARITY PRICE
1 0 0 ITEM_A RARE 10000 1 ITEM_B RARE 9000
2 0 0 ITEM_A RARE 10000 2 ITEM_C LEGEND 11000
3 1 1 ITEM_B RARE 9000 3 ITEM_D RARE 10000
4 1 1 ITEM_B RARE 9000 4 ITEM_E RARE 12000

 

JOIN ITEM_INFO INFO ON TREE.ITEM_ID = INFO.ITEM_ID이 쿼리는 찾아낸 업그레이드 아이템의 상세 정보를 가져오기 위해 필요하다. 문제가 요구 하는 것은 찾아낸 업그레이드 아이템의 상세정보를 찾아오기 위해 필요하다.  PARENT_INFO는 부모 아이템(이전 아이템) 그리고 ITEM_INFO는 현재 아이템의 정보다. 우리가 필요한건 

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 정보를 출력 해야 한다. 

여기서 아이템 희귀도가 RARE인건 부모 아이템이 RARE인 것을 말한다. 이 아이템들 중 다음 업그레이드 아이템은 현재 아이템이다. 그래서 JOIN을 두번 하는 이유는 첫번째 JOIN으로 부모아이템 정보를 찾아서 그 중 RARE인 아이템을 찾고 현재 아이템 정보를 가지고 와서  모든 다음 업그레이드 아이템(현재 ITEM)을  찾아서 가진 정보를 출력해 낸다. SELF JOIN의 업그레이드 버전이라고 생각한다.최종쿼리

더보기
SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_TREE TREE
JOIN ITEM_INFO PARENT_INFO ON TREE.PARENT_ITEM_ID = PARENT_INFO.ITEM_ID
JOIN ITEM_INFO INFO ON TREE.ITEM_ID = INFO.ITEM_ID
WHERE PARENT_INFO.RARITY = "RARE"
ORDER BY INFO.ITEM_ID DESC;