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

랜디 Randy·2024년 3월 21일
0

SQL 문제풀이

목록 보기
19/20
post-thumbnail

문제를 직접 풀어보고싶으신 분은 이 링크를 클릭해주세요

문제

문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

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


정답 코드

--ANSWER
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;

MAX를 사용할 수 없다

이 문제는 서브쿼리로 접근해야 합니다.
처음에는 다들

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

이런식으로 접근하셨을겁니다.
그러나 SQL의 실행순서를 생각해보면

SELECT가 실행되기 전에 GROUP BY가 먼저 실행됩니다.
GROUP BY는 테이블에서 가장 상단의 값을 그냥 가져오는 것이기 때문에
여기서 MAX()를 써버리면 FAVORITES의 최대값이 아니라 그냥 그룹화된 테이블의 최상단 값을 가져오게 됩니다.

따라서 출력이 제대로 되지않기때문에, 서브쿼리를 통해 약간 돌아가야 합니다.

서브쿼리 사용

서브쿼리를 사용해서 각 FOOD_TYPE에 FAVORITES 값이 가장 많은 값이 무엇인지 찾습니다.

그리고 이 값을 가진 REST_ID, REST_NAME을 메인 쿼리문에서 찾아 조합하는 과정을 보내야 합니다.

서브쿼리에서 FOOD_TYPE마다 MAX(FAVORITES)값을 찾아주었으므로 메인 쿼리에서 다시한번 GROUP BY문을 사용할 필요는 없습니다.
서브쿼리에 대한 내용을 잘 모르고있다 보니 너무 어려웠네요!
재밌는 문제였습니다ㅎㅎ

profile
데이터는 계단, 직관은 다리

0개의 댓글