[프로그래머스] 즐겨찾기가 가장 많은 식당 정보 출력하기

yannie·2024년 10월 2일
0

[문제]

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

[내가 푼 풀이(오답)]

-- 음식종류별 > 즐겨찾기 수가 가장 많은 식당
SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
;

웨..?
-> GROUP BY 후 그냥 MAX를 해버리는 이는 최대값이 아니라 테이블의 최상단 값을 가져와서 서브쿼리로 최대 값을 따로 찾아줘야 한다......
https://school.programmers.co.kr/questions/38854

[정답 코드]

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES)
IN (SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC
;

[코드리뷰]

  • 오답코드의 경우,
    그룹별 최대 FAVORITES값을 반환하는 것만 처리하고, REST_ID, REST_NAME과 같은 나머지 값들은 그 중 어떤 행의 값을 선택할지 알 수 없다. => 즉, MAX(FAVORITES)는 계산되지만, 이와 연결된 식당 ID나 이름을 정확히 최대 즐겨찾기 수와 매칭되지 않음.
  • 정답코드의 경우,
    서브쿼리로 각 음식 종류별 최대 즐겨찾기 수를 구한 후, 그 최대값과 해당 FOOD_TYPE을 다시 본쿼리에서 사용
    => FOOD_TYPE별로 FAVORITES가 가장 큰 행만 선택할 수 있다.

기억해!

MAX()함수만으로는 그룹화된 데이터에서 정확히 어떤 행이 최대값인지 알 수 없기 때문에 서브쿼리로 정확한 최대값을 포함하는 행을 조회하는 과정이 필요하다.

0개의 댓글