-
[프로그래머스] 업그레이드 된 아이템 구하기 Mysql코딩테스트 준비/SQL 2024. 10. 14. 00:36
https://school.programmers.co.kr/learn/courses/30/lessons/273711
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.
예를 들어 'ITEM_A'->'ITEM_B'->'ITEM_C'와 같이 업그레이드가 가능한 아이템이 있다면
'ITEM_C'의 PARENT 아이템은 'ITEM_B'
'ITEM_B'의 PARENT 아이템은 'ITEM_A'
ROOT 아이템은 'ITEM_A'가 됩니다.풀이1
- 모든 다음 업그레이드 아이템
- ITEM_TREE 테이블에서 PARENT_ITEM_ID가 업그레이드 이전, 현재 ITEM_ID가 업그레이드된 아이템이다.
따라서, ITEM_TREE을 두개 JOIN 하여(C table, D table) C 테이블에서 ITEM_ID와 D 테이블에서 PARENT_ITEM_ID를 조인한다면 D 테이블의 ITEM_ID는 C 테이블의 ITEM_ID의 업그레이드된 아이템이다SELECT 결과
- ITEM_TREE 테이블에서 PARENT_ITEM_ID가 업그레이드 이전, 현재 ITEM_ID가 업그레이드된 아이템이다.
- 희귀도가 'RARE'
- 희귀도는 ITEM_INFO에 있는 칼럼이기 때문에 ITEM_INFO도 조인을 해서 조건을 걸어줘야 함을 알 수 있다.
- 아이템 ID를 기준으로 내림차순 정렬
- ORDER BY ITEM_ID DESC 사용
해당 조건들을 파악한 후 쿼리문을 짜면 다음과 같다.
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY FROM ITEM_INFO A, (SELECT D.ITEM_ID FROM ITEM_INFO B, ITEM_TREE C, ITEM_TREE D -- 업그레이드인 아이템 ID만 추출 WHERE B.ITEM_ID = C.ITEM_ID AND C.ITEM_ID = D.PARENT_ITEM_ID -- C의 ITEM_ID와 D의 PARENT_ITEM_ID 조인 AND B.RARITY ='RARE' -- 조건은 RARE ) E WHERE A.ITEM_ID = E.ITEM_ID ORDER BY A.ITEM_ID DESC -- 정렬조건은 ITEM_ID 내림차순
풀이2
위와 조건은 동일하게 풀었지만, 조인이 아니라 서브쿼리를 활용하여 작성할 수도 있다.
- RARE에 해당하는 ITEM_ID를 ITEM_INFO 테이블에서 추출한다.
- 추출된 데이터를 ITEM_TREE에서 PARENT_ITEM_ID에 있는지 확인하고
그것의 ITEM_ID를 추출한다. (=업그레이드 ID 목록)
SELECT ITEM_ID, ITEM_NAME, RARITY FROM ITEM_INFO WHERE ITEM_ID IN (SELECT ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IN -- 2) (SELECT ITEM_ID FROM ITEM_INFO WHERE RARITY = 'RARE') -- 1) ) ORDER BY ITEM_ID DESC
'코딩테스트 준비 > SQL' 카테고리의 다른 글
[프로그래머스] 대장균들의 자식의 수 구하기 (MySQL) (0) 2024.11.04 [프로그래머스] 오프라인/온라인 판매 데이터 통합하기 Oracle (1) 2024.10.09 [프로그래머스] 상위 n개 레코드 ORACLE SQL (0) 2024.10.07 [프로그래머스] 서울에 위치한 식당 목록 출력하기 ORACLE (4) 2024.10.06 [프로그래머스] 강원도에 위치한 생산공장 목록 출력하기 (2) 2024.10.06 - 모든 다음 업그레이드 아이템