프로그래머스 SQL 고득점 Kit - SELECT: 업그레이드 된 아이템 구하기 (MySQL)

728x90
728x90

문제

난이도

Level 2

풀이 방법

문제를 이해하는데 조금 어려움을 겪었다.

"아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의"

 

이 부분이 뭔 소린가 했다.

 

이해는 됐어도 이걸 어떻게 구현해야 하는지가 막막했다.

 

item_tree에 나온 정보는 parent 아이템이라, 이걸 반대 방향으로 뒤집는 걸 구현하는 아이디어를 생각해 내기가 어려웠다.

 

우선 아이템의 희귀도가 'RARE'이면서, 누군가의 parent인 아이템을 찾기로 했다.

 

select a.item_id
from item_info a, item_tree b
where a.item_id = b.parent_item_id
and a.rarity = 'RARE'

 

위와 같은 쿼리를 짤 수 있었다.

 

이제 이 결과를 바탕으로 나온 아이템이 parent 아이템인 아이템들을 뽑아내면 된다.

 

따라서 위의 쿼리를 where 절에서 subquery로 넣었고 다중 행을 출력하므로 in을 사용했다.

 

위 쿼리 결과로 나온 아이템이 parent 아이템인 아이템을 뽑아야 하므로 where 절은 다음과 같이 된다.

where parent_item_id in (select a.item_id
                         from item_info a, item_tree b
                         where a.item_id = b.parent_item_id
                         and a.rarity = 'RARE')

 

parent_item_id 컬럼은 item_tree 테이블에 있지만, item_id, item_name, 그리고 rarity를 출력해야 하는데, 이 컬럼은 item_info 테이블에 있으므로

 

item_info 테이블과 item_tree 테이블을 모두 사용해야 했다.

 

따라서 'c.item_id = d.item_tree' 조건을 주어 암시적 inner join을 이용했고 최종 코드는 아래와 같이 나왔다.

 

풀이

select c.item_id, c.item_name, c.rarity
from item_info c, item_tree d
where d.parent_item_id in (select a.item_id
                           from item_info a, item_tree b
                           where a.item_id = b.parent_item_id
                           and a.rarity = 'RARE')
and c.item_id = d.item_id
order by c.item_id desc
반응형