카테고리 없음

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

도도도영 2024. 10. 20. 12:32

문제

 

핵심

1. '통계 함수의 결과'에 추가 조건을 붙이고 싶을 때에는 서브 쿼리 또는 임시 테이블을 사용해야 한다.

 


 

비교

SELECT fp.category, max(fp.price) as max_price, fp.product_name
from food_product fp
group by fp.category
having fp.category in ('과자', '국','김치','식용유')
order by max_price desc

 

위 쿼리에서는 조회할 때 max(price)를 하고,

category 별로 Grouping 했고 (Group by),

Grouping 한 결과에 조건을 추가했다 (Having).

 

하지만 위 쿼리는 정답이 아니다.

 

조회 컬럼 2개만 봤을 때는 category별로 Max price를 추출한다. 하지만 상품 이름은?

 

위 쿼리는 최대 가격을 가진 제품의 이름을 추출하는 방법이 아니다.
가격 중 가장 높은 가격에 해당하는 상품 이름이 추출되리라는 보장이 없기 때문이다.

 

따라서 최대 가격에 해당하는 상품 이름이 나올 수 있도록 분명한 조건이 필요하다 

 

 

정답

1. 서브 쿼리

SELECT category, price AS max_price, product_name
FROM food_product
WHERE category IN ('과자', '국', '김치', '식용유')
  AND (category, price) IN (
    SELECT category, MAX(price)
    FROM food_product
    WHERE category IN ('과자', '국', '김치', '식용유')
    GROUP BY category
  )
ORDER BY max_price DESC;

 

 

2. 임시 테이블 (Common Table Expression)

WITH max_price_per_category AS (
  SELECT category, MAX(price) as max_price
  FROM food_product
  WHERE category IN ('과자', '국', '김치', '식용유')
  GROUP BY category
)
SELECT fp.category, mp.max_price, fp.product_name
FROM food_product fp
JOIN max_price_per_category mp
  ON fp.category = mp.category AND fp.price = mp.max_price
ORDER BY mp.max_price DESC