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


풀이
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, FAVORITES
FROM REST_INFO
- 결과 예시와 일치하도록 컬럼명을 SELECT문에 배치한다
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE)
- 음식종류별로 즐겨찾기수가 가장 많은 식당이라는 2가지 조건을 충족해야 하므로 WHERE절 서브쿼리 중 다중컬럼 서브쿼리 문제이다
- 다중컬럼 서브쿼리는 2개 이상의 컬럼을 참조하며, 계산 결과 2개 컬럼 이상의 테이블 형태를 출력한다
- 다중 컬럼 비교 시 비교 대상이 되는 컬럼은 (1) 괄호로 꼭 묶어야 하며, (2) 서브쿼리의 SELECT문 컬럼 순서와 반드시 동일해야 한다
- 메인 쿼리 WHERE문에서 FOOD_TYPE(음식 종류), FAVORITES(즐겨찾기) 를 괄호로 묶은 뒤 IN 을 넣어 서브쿼리 추출 결과 테이블에 있는 데이터만 필터링되도록 한다. 서브쿼리에서는 음식종류별(GROUP BY FOOD_TYPE) 즐겨찾기 수가 가장 많은 식당( MAX(FAVORITES) ) 데이터만 필터링된 테이블을 만든다
→ 음식종류별로 즐겨찾기수가 가장 많은 식당만 필터링된다
ORDER BY FOOD_TYPE DESC
- 음식 종류 기준 내림차순 정렬한다
💬 오답노트
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;
- SUM, COUNT와 달리 MAX 는 FAVORITES 컬럼만 최댓값으로 가져오고, FOOD_TYPE, REST_ID, REST_NAME의 다른 컬럼은 GROUP BY로 묶은 카테고리별 최상단에 있는 데이터들을 임의로 가져온다. 즉, 즐겨찾기 수와 식당 정보( FOOD_TYPE, REST_ID, REST_NAME )가 매칭되지 않는다.
2번째 풀이
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE FOOD_TYPE IN (SELECT FOOD_TYPE
FROM REST_INFO
GROUP BY FOOD_TYPE
HAVING FAVORITES = MAX(FAVORITES))
ORDER BY FOOD_TYPE DESC
- 다중행 서브쿼리로도 풀어볼 수 있다. WHERE절 서브쿼리 중 FOOD_TYPE만 조건 비교 컬럼으로 삼은 뒤, 서브쿼리에 HAVING문을 추가하여 "각 FOOD_TYPE 그룹에서 즐겨찾기 수가 최댓값인 데이터만 필터링하라"는 조건을 주었다. 필터링 결과는 위 다중컬럼 서브쿼리 결과와 같으며 이외 쿼리는 동일하다.
'SQL > 코딩테스트' 카테고리의 다른 글
[leetcode / MySQL] 183. Customers Who Never Order (0) | 2024.01.29 |
---|---|
[leetcode / MySQL] 1179. Reformat Department Table (4) | 2024.01.29 |
[프로그래머스 / MySQL] 중복 제거하기 (0) | 2024.01.29 |
[프로그래머스 / MySQL] 여러 기준으로 정렬하기 (0) | 2024.01.29 |
[프로그래머스 / MySQL] 상위 n개 레코드 (0) | 2024.01.29 |