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

hyunddu·2024년 2월 7일
0

SQL

목록 보기
3/19
post-thumbnail

[level 3] 즐겨찾기가 가장 많은 식당 정보 출력하기 - 131123

문제 링크

문제 설명

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

Column name Type Nullable
REST_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문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.


예시

REST_INFO 테이블이 다음과 같을 때

REST_ID REST_NAME FOOD_TYPE VIEWS FAVORITES PARKING_LOT ADDRESS TEL
00001 은돼지식당 한식 1150345 734 N 서울특별시 중구 다산로 149 010-4484-8751
00002 하이가쯔네 일식 120034 112 N 서울시 중구 신당동 375-21 NULL
00003 따띠따띠뜨 양식 1234023 102 N 서울시 강남구 신사동 627-3 1F 02-6397-1023
00004 스시사카우스 일식 1522074 230 N 서울시 서울시 강남구 신사동 627-27 010-9394-2554
00005 코슌스 일식 15301 123 N 서울특별시 강남구 언주로153길 010-1315-8729

SQL을 실행하면 다음과 같이 출력되어야 합니다.

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

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges


나의 풀이

아마도 이 글을 클릭 한 사람이라면, 아래와 같이 코드를 짜서 오류가 났을 가능성이 클 것같다. 

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

이렇게 짜게 되면, FOOD_TYPE에 따른 MAX(FAVORITES)값, 즉 즐겨찾기가 가장 많은 값을 가져올 순 있다. 실행을 시키면 아래와 같은 결과가 나온다.

하지만, 이러면 문제가 MAX(FAVORITES)와 REST_NAME이 매칭이 되지 않는다는 점이다. 이유는 GROUP BY을 FOOD_TYPE으로 묶으면, 기본적으로 한식의 맨 첫번째, 일식의 맨 첫번째 ... 를 가져오게 되기 때문이다.

SELECT *
FROM REST_INFO; 

이렇게 테이블을 모두 불러오게 되면, 아래와 같이 '하이가쯔네'라는 식당은 FAVORITES가 112라는 걸 알 수 있다. 즉, 위 결과와 매칭이 되지 않는다. 

이를 해결하기 위해서는 WHERE절과 서브쿼리를 써야한다. 아래의 쿼리문을 실행시켜 보면, FOOD_TYPE에 따른 가장 FAVORITES이 높은 값을 불러올 수 있는데, 이 데이터를 원본 테이블에 매칭 시켜주면 된다. 

SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE;

매칭을 하기 위해 WHERE절을 써야하고, IN 안에 위 서브쿼리를 사용함으로써 위 결과와 똑같은 테이블만 불러오게끔 할 수 있다. 그러면 최종적으로 아래와 같은 결과를 얻을 수 있다.

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

0개의 댓글

관련 채용 정보