문제 풀이/프로그래머스 SQL

즐겨찾기가 가장 많은 식당 정보 출력하기, 식품분류별 가장 비싼 식품의 정보 조회하기

열심히 해 2024. 10. 14. 09:37

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

 

 

 

오답 : 

SELECT food_type, rest_id, rest_name, max(favorites)
from rest_info
group by 1
order by 4 desc

 

GROUP BY를 사용할 때 문제는 GROUP BY에 명시된 컬럼이 아닌 다른 컬럼들(rest_id, rest_name)이 집계 함수 없이 SELECT 절에 포함될 경우 발생합니다. 이때 어떤 rest_id와 rest_name을 선택해야 할지 명확하지 않기 때문에 원하는 결과를 얻을 수 없습니다.

 

즉 "GROUP BY를 사용하면 MAX(favorites) 같은 집계 함수는 제대로 작동하지만, 동일한 음식 종류 내에서 어떤 rest_id와 rest_name을 반환할지 결정되지 않는다"는 문제가 발생합니다.

 

 

정답 :

SELECT RI.FOOD_TYPE, RI.REST_ID, RI.REST_NAME, RI.FAVORITES
FROM REST_INFO RI
WHERE RI.FAVORITES = (
    SELECT MAX(FAVORITES)
    FROM REST_INFO
    WHERE FOOD_TYPE = RI.FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;

 

SELECT MAX(FAVORITES FROM REST_INFO WHERE FOOD_TYPE = RI.FOOD_TYPE는 서브쿼리입니다. 이 서브쿼리는 REST_INFO 테이블에서 각 음식 종류별(FOOD_TYPE)로 최대 즐겨찾기 수(FAVORITES)를 구합니다. 중요한 점은 이 서브쿼리에서 RI.FOOD_TYPE를 참조하고 있다는 점입니다.

 

RI.FOOD_TYPE: 메인 쿼리에서 RI.FOOD_TYPE는 REST_INFO 테이블의 FOOD_TYPE 컬럼을 나타냅니다. 서브쿼리에서 FOOD_TYPE = RI.FOOD_TYPE 조건은 "현재 메인 쿼리에서 선택된 FOOD_TYPE와 같은 FOOD_TYPE을 가진 레코드를 서브쿼리에서 찾는다"는 의미입니다. 즉, 메인 쿼리의 각 FOOD_TYPE에 대해 서브쿼리가 그 음식 종류의 최대 즐겨찾기 수를 반환하게 됩니다.

RI.FOOD_TYPE가 중요한 이유: 메인 쿼리와 서브쿼리가 동일한 FOOD_TYPE를 기준으로 작동하도록 해줍니다. 서브쿼리가 동일한 FOOD_TYPE을 가진 식당들 중에서 최대 FAVORITES 값을 계산하게 됩니다.

 

 

 

비슷한 문제: 

 

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

 

 

정답 : 

더보기
select fp.CATEGORY, price MAX_PRICE, fp.PRODUCT_NAME
from food_product fp
where fp.price = (
    SELECT max(price)
    from food_product
    where CATEGORY = fp.CATEGORY
) and CATEGORY in ('과자', '국', '김치', '식용유')
order by price desc