SQL

[SQL 고득점 Kit] 즐겨찾기가 가장 많은 식당 정보 출력하기

디두현 2024. 9. 3. 20:27

호호 ,, 인턴 기간동안 여러가지 테이블을 사용하다보니 쿼리 사용 능력이 많이 향상된 것 같다.

따로 쿼리 공부를 한 적은 없었는데, 쿼리 테스트도 준비 해야하는 김에 기본기부터 다시 정리해야겠다.

 

1. 문제 설명(https://school.programmers.co.kr/learn/courses/30/lessons/131123)

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

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

 

2. 내 쿼리

SELECT 
    a.FOOD_TYPE, 
    a.REST_ID, 
    a.REST_NAME, 
    a.FAVORITES
FROM 
    REST_INFO a
JOIN (
    SELECT 
        FOOD_TYPE, 
        MAX(FAVORITES) AS fav
    FROM 
        REST_INFO
    GROUP BY 
        FOOD_TYPE
) b 
ON a.FOOD_TYPE = b.FOOD_TYPE 
AND a.FAVORITES = b.fav
ORDER BY 
    a.FOOD_TYPE DESC;

 

각 음식 종류(FOOD_TYPE)별로 즐겨찾기 수가 가장 많은 식당을 찾으려면,
1) 먼저 음식 종류별로 최대 즐겨찾기 수를 찾고,
2) 그 값을 가진 식당을 조인해야 한다.
(내가 제일 자주 틀렸던 유형이라 보자마자 생각났다 ^^,,,,,)

  • 서브 쿼리 : FOOD_TYPE별로 가장 높은 즐겨찾기 수(MAX(FAVORITES))를 계산하여 fav로 반환한다.
  • 메인 쿼리는 REST_INFO 테이블과 서브쿼리를 조인하여, 각 음식 종류에서 즐겨찾기 수가 가장 높은 레코드를 선택한다.
  • 조인 조건을 걸어 FOOD_TYPE과 FAVORITES가 서브쿼리에서 계산한 값과 일치하는 행을 선택한다.

이렇게 하면, 음식 종류별로 최대 즐겨찾기를 가진 식당에 대한 정보를 출력할 수 있다.