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의 업그레이드 버전이라고 생각한다.최종쿼리
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;
'MYSQL > 프로그래머스 LV02' 카테고리의 다른 글
조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2025.02.21 |
---|---|
ROOT 아이템 구하기 (0) | 2025.02.21 |
조건에 맞는 개발자 찾기 (0) | 2025.02.17 |
노선별 평균 역 사이 거리 조회하기 (0) | 2025.02.14 |
물고기 종류 별 잡은 수 구하기 (0) | 2025.02.14 |