문제 풀이/SQL

[SQL/MySQL] [programmers] 즐겨찾기가 가장 많은 식당 정보 출력하기

일 월 2023. 3. 27. 14:25

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

 

프로그래머스

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

programmers.co.kr


문제 설명

식당의 정보를 담은 REST_INFO 테이블


Column name   Type Nullable
REST_ID 식당 ID VARCHAR(5) FALSE
REST_NAME 식당 이름 VARCHAR(50) FALSE
FOOD_TYPE 음식 종류 VARCHAR(20) TRUE
VIEWS 조회수 NUMBER TRUE
FAVORITES 즐겨찾기수 NUMBER TRUE
PARKING_LOT 주차장 유무 VARCHAR(1) TRUE
ADDRESS 주소 VARCHAR(100) TRUE
TEL 전화번호 VARCHAR(100) TRUE


문제

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

 

출력 예시

FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 00001 은돼지식당 734
일식 00004 스시사카우스 230
양식 00003 따띠따띠뜨 102

1. 서브 쿼리로 그룹별 최댓값을 구하고, INNER JOIN으로 일치하는 행 조회

SELECT o.FOOD_TYPE, o.REST_ID, o.REST_NAME, o.FAVORITES
FROM REST_INFO o INNER JOIN
(SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES FROM REST_INFO
GROUP BY FOOD_TYPE) t
ON o.FOOD_TYPE = t.FOOD_TYPE AND o.FAVORITES = t.FAVORITES
ORDER BY FOOD_TYPE DESC;

 

2. HAVING 사용 => 틀린 풀이

그룹으로 묶으면 REST_ID, REST_NAME이 FAVORITES가 최댓값일 때의 값과 일치하지 않음

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