📊 Algorithm&SQL

[MySQL/프로그래머스] 식품분류별 가장 비싼 식품의 정보 조회하기

오늘 ONEUL 2023. 5. 11. 23:44

 

문제

 

 

 

풀이

(1) 문제 분석하기

  • 식품분류별 가격이 제일 비싼 식품의 정보
    ⇒ GROUP BY를 이용하여 식품분류별로 묶고, MAX(PRICE)로 제일 비싼 식품 조회
  • 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력
    ⇒ HAVING 식품분류 IN ('과자', '국', '김치', '식용유')
  • 식품 가격을 기준으로 내림차순 정렬
    ORDER BY 식품 가격 DESC

 

(2) 쿼리 구현하기

🔸 첫 번째 시도

SELECT CATEGORY, MAX(PRICE) AS 'MAX_PRICE', PRODUCT_NAME
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY MAX_PRICE DESC

 

결과는?!

후..

아니 왜지?!

답답한 마음에 FOOD_PRODUCT 테이블 전체를 보면서 내가 작성한 쿼리와 하나하나 대조해보았다.
내가 작성한 쿼리의 실행결과는 다음과 같다.

가장 비싼 식용유의 이름이 '맛있는콩기름' 으로 나온다.
하지만 실제로 확인해보면?

 

가격 8950원의 식용유 이름은 '맛있는마조유'이다..!

아니 이게 왜 다르게 나오는거야????😦
혼란스런 와중 다음과 같은 댓글을 보게 되었다.

 

그렇다.
이 문제는 GROUP BY로 뽑아낸 결과 중 가장 큰 값(MAX)의 행을 가져와야 한다.
그러나 내가 작성한 쿼리에서 PRODUCT_NAME은 그저 PRODUCT_ID 순서로 첫 번째 값을 가져오고 있었다.

 

🔸 두 번째 시도 (정답)

SELECT CATEGORY, PRICE AS 'MAX_PRICE', PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY, PRICE)
IN (SELECT CATEGORY, MAX(PRICE)
    FROM FOOD_PRODUCT
    GROUP BY CATEGORY
    HAVING CATEGORY IN ('과자', '국', '김치', '식용유'))
ORDER BY MAX_PRICE DESC

서브쿼리로 WHERE 절에서 IN을 이용하여 가장 비싼 식품의 식품 분류와 가격을 먼저 조회하고,
해당하는 PRODUCT_NAME을 출력하는 것으로 해결!

 

 

 

 

 

프로그래머스

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

programmers.co.kr