본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Programmers - 업그레이드 된 아이템 구하기

by kime2 2024. 6. 11.
출처
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.

 

문제에 대한 해석

-- 조회 : 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)
-- 조건 : 'RARE'인 아이템들의 모든 다음 업그레이드 
-- 정렬 : 아이템 ID를 기준으로 내림차순 

 

풀이(MYSQL)

with parent as (
    select i.item_id 
    from ITEM_INFO i
    join ITEM_TREE t
    on i.item_id = t.item_id
    where i.rarity = 'RARE'
    ) -- 희귀도가 rare인 아이템(원조parent)
select i.item_id, i.item_name, i.rarity
from ITEM_INFO i
    join ITEM_TREE t
    on i.item_id = t.item_id
where t.parent_item_id in (select item_id
                           from parent)
order by i.item_id desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. WITH 절: ITEM_INFO와 ITEM_INFO를 조인하여 희귀도가 rare인 item의 테이블을 만든다(parent)
  2. FROM 절:  ITEM_INFO와 ITEM_INFO를 조인하여
  3. WHERE 절: 각 아이템의 부모아이템( parent_item_id)이 parent테이블에 있을 경우 필터링 하여
  4. SELECT 절: i.item_id, i.item_name, i.rarity를 조회한다
  5. ORDER BY 절: i.item_id 내림차순 순으로

 

배운점

요구조건 잘보기

  • A -> B -> C로 진화할 경우 다음의 업그레이드는 B,C가 조회된다
  • 또 B -> D로도 진화가 가능할 경우 D도 조건에 충족
  • 이때 root아이템을 찾고자 parent_item_id is null 의 조건을 부여하면 B는 출력되지 않으므로
  • root아이템을 찾는 것이 아닌 최초 진화의 다음단계를 조회하는 쿼리를 작성해야 한다