mysql 문제풀이/easy

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

gooreumsea 2023. 8. 16. 13:27

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

 

습득한점:

 

 

*** LIMIT은 서브쿼리에 들어가면 쿼리 실행자체가 안된다는 점


*** GROUP BY된 상태로 SELECT 함수 인자로 MAX func 활용할 때,
     
각 그룹의 첫번째 값이 끌려올 뿐, MAX func가 적용되지 않는 점

 

 

추출 데이터
전체 데이터

 

 

 

문제:

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 쿼리작성.

이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력.

결과는 식품 가격을 기준으로 내림차순 정렬.

 

 

 

문제파악:

각 카테고리(식품분류)에서 최대값을 나타내는 식품명(PRODUCT_NAME)을 찾아야 하는데,

'면' 그룹내 PRICE 값이 같은 항목이 존재함. 그룹별 최대값으로서 PRICE 값은 4950원으로 서로 같지만, 식품명은 다른 상황.

"이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력" 라는 조건이 없었다면, 이 문제는 잘못 설계된 문제

 

 

 

 

풀이:

처음에는 고유값 PRODUCT_ID를 활용해서 PRICE 값 기준 내림차순 정렬하여 첫번째 값만 찾은 뒤,
그렇게 찾은 PRODUCT_ID를 WHERE 절에 활용하고 싶었지만...

서브쿼리에는 LIMIT 를 사용할 수 없더라.

LIMIT을 억지로 감싸는 방법이 있는 것 같지만, 코드 가독성이 안좋을 것 같다.

 

 

 

결국 그룹별 PRICE 최대값을 찾아, 이를 조건에 넣어 매칭시키기로 했다.

 

각 식품분류(CATEGORY)별 MAX(PRICE) 값만 추출 후,

이를 첫번째 일치 조건으로 활용하기 위해 서브쿼리로 감싸서 WHERE 구문에 삽입

두번째 식품분류 일치 조건은 AND CATEGORY IN ( '과자', '국', 김치', '식용유' ) 으로 엮여주기

 

    조건1: 추출한 MAX(PRICE)값이 FOOD_PRODUCT 테이블의 PRICE 값과 같은지

    조건2: 식품 분류가 '과자', '국', '김치', '식용유' 해당하는지

 

마지막으로 내림차순 쿼리까지 잘 작성해주면 된다.

 

 

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