select item.item_id, item.item_name, item.RARITY
from item_info item
INNER JOIN (
select *
from item_info i
inner join (
SELECT
i.item_id AS child_item_id,
t.parent_item_id
FROM item_info i
INNER JOIN item_tree t
ON i.item_id = t.item_id
) a
on i.item_id = a.parent_item_id
where i.RARITY = 'RARE'
) b
on item.item_id = b.child_item_id
order by item.item_id desc
서브쿼리 -> JOIN 으로 변경 예정
1. ITEM_INFO와 ITEM_TREE를 INNER JOIN 하여 전체 정보 가져오기
2. ITEM_INFO 자신을 한번 더 INNER JOIN 하여 1번에서 가져 온 PARENT_ITEM_ID와 일치하는 기존(I2) 자신 테이블 ITEM_ID만 조회
3. JOIN이 되지 않은 기존 테이블(I2) 가 'RARE'인 경우에 대해서만 조건 처리
4. ITEM_ID 내림차순 정렬
SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I
INNER JOIN ITEM_TREE T
ON I.ITEM_ID = T.ITEM_ID
INNER JOIN ITEM_INFO I2
ON I2.ITEM_ID = T.PARENT_ITEM_ID
WHERE I2.RARITY = 'RARE'
ORDER BY I.ITEM_ID DESC
+ 조금 더 직관적인 방법
1. PARENT_ITEM_ID 정보와 ITEM_ID 를 연결하여 PARENT_ITEM_ID 에 대한 ITEM_ID 가져오기 및 RARITY = 'RARE' 필터링
2. 1번에서 필터링한 ITEM_ID 과 자기 자신(ITEM_INFO) 테이블 다시 INNER JOIN
3. I2 기준 내림차순 정렬
SELECT I2.ITEM_ID, I2.ITEM_NAME, I2.RARITY
FROM ITEM_INFO I
INNER JOIN ITEM_TREE T
ON I.ITEM_ID = T.PARENT_ITEM_ID
INNER JOIN ITEM_INFO I2
ON I2.ITEM_ID = T.ITEM_ID
WHERE I.RARITY = 'RARE'
ORDER BY I2.ITEM_ID DESC'코딩테스트 연습 > programmers' 카테고리의 다른 글
| [프로그래머스] 특정 물고기를 잡은 총 수 구하기 - MYSQL (0) | 2025.10.26 |
|---|---|
| [프로그래머스] 조건에 맞는 개발자 찾기 - MYSQL (0) | 2025.10.26 |
| [프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 - MYSQL (0) | 2025.10.21 |
| [프로그래머스] 식품분류별 가장 비싼 식품의 정보 조회하기 - MYSQL (0) | 2025.10.20 |
| [프로그래머스] 입국 심사 - JAVA (0) | 2025.10.20 |