SQL/문제풀이

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

응엉잉 2024. 2. 12. 01:52

https://school.programmers.co.kr/learn/courses/30/lessons/131116

 

프로그래머스

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

programmers.co.kr

처음에는 이렇게 짜면 될줄알았다.

SELECT category,
    product_name,
    MAX(price) AS price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유')

 

식용유 맛있는콩기름 8950
김치 맛있는배추김치 19000
맛있는미역국 2900
과자 맛있는포카칩 1950

 

하지만 스스로 미심쩍어서 확인해본 결과 ...

SELECT *
FROM food_product
WHERE category = '식용유'
ORDER BY price DESC

 

P0014 맛있는마조유 CD_OL00004 식용유 8950
P0012 맛있는올리브유 CD_OL00002 식용유 7200
P0013 맛있는포도씨유 CD_OL00003 식용유 5950
P0011 맛있는콩기름 CD_OL00001 식용유 4880

 

맛있는콩기름의 가격은 8950원이 아니다!

그저 맛있는콩기름이 식용유 중 첫번째 순서이기 때문에 위 쿼리를 실행했을 때 맛있는콩기름을 가져오는거다.

 

그래서 식품분류별 최고가를 먼저 뽑은 후에, 이를 다중열 서브쿼리를 활용해보려 한다.

WHERE절 서브쿼리에 들어갈 내용은 다음과 같다.

SELECT category,
    MAX(price) AS price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유')

 

WHERE절 서브쿼리로 다중열 서브쿼리를 사용하고 싶은 경우, () 를 사용해줘야 한다.

 

[Solution]

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

 

이 풀이가 가장 효율적인지 확인하기 위해 다른 사람의 풀이를 찾아보았다.

 

WHERE절 서브쿼리가 헷갈리면 WITH를 활용해서 임시 테이블을 만든 후 사용할 수도 있다.

https://ittrue.tistory.com/420

 

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

문제링크 https://school.programmers.co.kr/learn/courses/30/lessons/131116 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합

ittrue.tistory.com

WITH temp AS (
    SELECT category,MAX(price) AS max_price
    FROM food_product
    GROUP BY category 
    HAVING category IN ('과자', '국', '김치', '식용유') -- GROUP BY 이후 조건은 HAVING
) -- WITH 를 사용하고 싶으면 AS 로 임시 테이블의 이름을 만들어줘야 함

SELECT t.category, t.max_price, f.product_name
FROM food_product f
	INNER JOIN temp t ON f.category = t.category AND f.price = t.max_price -- INNER JOIN 으로 temp 에 있는 데이터만
ORDER BY t.max_price DESC -- 2 DESC 로도 가능