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

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

by Hi_heidi 2024. 1. 29.

문제

💡 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 그룹에서 즐겨찾기 수가 최댓값인 데이터만 필터링하라"는 조건을 주었다. 필터링 결과는 위 다중컬럼 서브쿼리 결과와 같으며 이외 쿼리는 동일하다.