REST_INFO테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
# 답안1 - JOIN을 사용
WITH MAX_FAVORITES AS(
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
)
SELECT M.FOOD_TYPE, R.REST_ID, R.REST_NAME, M.FAVORITES
FROM MAX_FAVORITES AS M LEFT JOIN REST_INFO AS R
USING(FOOD_TYPE, FAVORITES)
ORDER BY FOOD_TYPE DESC;
# 답안2 - WHERE문을 사용
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;
처음에는 GROUP BY문으로 FOOD_TYPE을 기준으로 그룹화한다음, SELECT 문을 아래와 같이 작성했더니 틀렸다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
생각해보면, FOOD_TYPE으로 그룹화했어도 REST_ID, REST_NAME에 대해 집계가 잡히지 않으니 오류없이 출력이 되었어도 사실은 틀렸다는 걸 의미했다. 문제를 읽었을 때는 쉬울줄 알았는데 10분 넘게 안 풀려서 시간재고 풀 당시에는 그냥 넘어갔었다. 앞으로 GROUP BY문을 사용할 때 이 부분을 주의해야 겠다.
추가적으로, 스터디원의 답안을 보며 WHERE문에서 반환한 서브쿼리의 여러쿼리의 쌍을 일치하는 행을 찾는게 가능하다는 사실도 알았다. 나중에 유용하게 쓰일 듯하다.