본문 바로가기
코딩테스트/SQL 코테

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

by 코듀킹 2023. 7. 27.

정답코드

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;

 

 

설명

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

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;

댓글