호호 ,, 인턴 기간동안 여러가지 테이블을 사용하다보니 쿼리 사용 능력이 많이 향상된 것 같다.
따로 쿼리 공부를 한 적은 없었는데, 쿼리 테스트도 준비 해야하는 김에 기본기부터 다시 정리해야겠다.
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가 서브쿼리에서 계산한 값과 일치하는 행을 선택한다.
이렇게 하면, 음식 종류별로 최대 즐겨찾기를 가진 식당에 대한 정보를 출력할 수 있다.