Skills/SQL

프로그래머스: 업그레이드 할 수 없는 아이템 구하기 (MySQL)

듀공🥕 2024. 3. 13. 03:38

 

1. 문제


2. 문제 풀기 전 생각해 볼 것

  • ITEM_INFO 👉🏻 아이템 ID, 아이템 명, 희귀도 조회
  • ITEM_TREE  👉🏻 (서브 쿼리를 이용할 때) PARENT 아이템 ID 조회
  • 더 이상 업그레이드 할 수 없는 아이템이어야 함
  • 아이템 ID DESC

3. 테이블

ITEM_INFO

 
ITEM_TREE

 

4. 풀이 과정 (LEFT JOIN 사용)

1단계) '두 테이블을 이용하여 더 이상 업그레이드 할 수 없는 아이템'을 조회하기 위해, 교집합을 보여주는 INNER JOIN 말고 다른 것을 생각해 볼 필요가 있다.

ITEM_INFO 테이블을 기준으로 아이템들의 업그레이드 전을 보아야 하니 LEFT JOIN을 해 준다.
아래의 출력값을 보면 업그레이드가 가능한 아이템 리스트를 볼 수 있는데, 여기서 아이템 ID와 PARENT 아이템 IDNULL값인 것은 더 이상 업그레이드가 불가능한 아이템이라는 것을 의미한다.

SELECT *
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
    ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID;

 
2단계) NULL값을 제외해 주는 진정한(?) LEFT JOIN을 해준다.

SELECT *
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
    ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
WHERE TREE.PARENT_ITEM_ID IS NULL;

 
3단계) 아이템 ID, 아이템 명, 희귀도를 조회해 주는 SELECT문을 작성하고, 아이템 ID를 기준으로 내림차순 정렬해 준다.

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID 
                      FROM ITEM_TREE
                      WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY ITEM_ID DESC;

 

5. 완성 코드

-- LEFT JOIN 이용
SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
    ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
WHERE TREE.PARENT_ITEM_ID IS NULL
ORDER BY INFO.ITEM_ID DESC;

번외편) 서브 쿼리를 통해 해결한다면?

LEFT JOIN을 사용하지 않아도 서브 쿼리를 통해 문제 해결이 가능하다.
 

풀이 과정 (서브 쿼리 사용)

1단계) ITEM_INFO 테이블의 아이템 ID, 아이템 명, 희귀도를 조회해 주는 SELECT문을 작성한다.

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO

 
2단계) 이제 더 이상 업그레이드 할 수 없는 아이템을 조건으로 추가할 차례입니다.
서브 쿼리는 TREE.PARENT 아이템 ID를 조회해야 한다. 해당 컬럼에서 NULL값이 아닌 값은 모두 업데이트가 가능한 아이템이기 때문에 IS NOT NULL을 통해 특정시켜 준다.

    👨🏻‍🏫 IS NULL = NULL인 데이터 조회, IS NOT NULL = NULL이 아닌 데이터를 조회

그리고 외부 쿼리에 있는 ITEM_ID 컬럼에서 NOT IN을 통해 서브 쿼리에서 특정한 값을 제외시켜 주면, 업데이트가 안 되는 아이템만 남는다.

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID 
                      FROM ITEM_TREE
                      WHERE PARENT_ITEM_ID IS NOT NULL)

 
3단계) 아이템 ID를 기준으로 내림차순 정렬을 해준다.

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID 
                      FROM ITEM_TREE
                      WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY ITEM_ID DESC;

 

완성 코드

-- 서브 쿼리 이용
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID 
                      FROM ITEM_TREE
                      WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY ITEM_ID DESC;

 
 

🔗 관련 링크

프로그래머스 문제 - https://school.programmers.co.kr/learn/courses/30/lessons/273712

IS NULL 함수 설명 - https://passwd.tistory.com/entry/MySQL-NULL-처리-IS-NULL-IFNULL

JOIN 종류 설명 - https://chlgpdus921.github.io/basecamp/MySQL-JOIN/

 

728x90