카테고리 없음
[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