본문 바로가기

코딩테스트 연습/programmers

[프로그래머스] 업그레이드 된 아이템 구하기 - MYSQL

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