SQL/프로그래머스 SQL

MySQL 프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 문제 답

진리뷰 2023. 11. 3. 09:00
반응형

 

 

MySQL-프로그래머스-즐겨찾기가-가장-많은-식당-정보-출력하기-문제-답-썸네일
즐겨찾기가 가장 많은 식당 정보 출력하기

 

 

이 글은 프로그래머스 SQL 고득점 Kit 문제와 답을 정리한 글입니다.

*MySQL 버전입니다.

 

 

 

프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 문제

 

💡음식 종류, 음식 종류ID, 식당명, 즐겨찾기 수 출력하기

  • 음식 종류별 즐겨찾기 수 가장 많은 식당 정보 출력
  • 음식 종류 기준 내림차순 정렬

 

프로그래머스-즐겨찾기가가장많은식당정보출력-문제
즐겨찾기가 가장 많은 식당 정보 출력 문제

 

 

프로그래머스-즐겨찾기가가장많은식당정보출력-출력-샘플
즐겨찾기가 가장 많은 식당 정보 출력 샘플

 

 

 

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

 

💡 문제 포인트: 음식 종류별 즐겨찾기 수 가장 많은 식당 필터링

with a as(
select max(favorites) as m
from rest_info
group by food_type
)

select b.FOOD_TYPE
, b.REST_ID
, b.REST_NAME
, b.FAVORITES
from rest_info as b, a
where a.m = b.favorites
group by food_type
order by food_type desc;

 


 

join이나 서브쿼리를 이용할 수 있으나, with 사용을 선호해서 with로 작성했다.

일단 max를 메인 쿼리 select에 바로 쓰면 문제가 생기는데, 이는 추가 정리에 정리했다.

 

포인트는 with로 음식 종류별 즐겨찾기 수 가장 많은 식당만 필터링하는 것이다.

그래서 테이블 a에 먼저 food_type을 그룹화 하고, 즐겨찾기 수가 max인 데이터만 선택한다.

 

이제 메인쿼리에서 테이블 a와 b를 함께 사용한다.

이때 음식 종류별 가장 많은 즐겨찾기 수는 테이블 a와 b가 모두 같아야 한다는 점이 중요하다.

*추가 정리에서 이유 설명

from rest_info as b, a
where a.m = b.favorites

 

 

 

 

추가 정리

 

아래 쿼리는 이 문제의 함정? 오답이다.

이유는 select의 max와 group by 때문이다.

select FOOD_TYPE
, REST_ID
, REST_NAME
, MAX(FAVORITES) as FAVORITES
from REST_INFO

group by FOOD_TYPE
order by FOOD_TYPE desc;

 

max(favorites)를 메인쿼리에 냅다 써버리면, 가장 많은 즐겨찾기 수와 음식점의 정보가 불일치한다.

from 다음으로 실행되는 음식 종류별(food_type)로 그룹화하면, 일식에는 하이가쯔네 식당 정보가 출력된다.

왜냐하면 일식 그룹의 가장 첫번째 행에 하이가쯔네 식당 정보가 있기 때문이다.

 

이후  select의 max(favorites)이 실행되어, 음식 종류 별 그룹의 max값을 가져온다.

하지만 favorites만 고려한 max 값을 가져와, max값과 식당 정보가 불일치한다.

일식을 예시로 들면, max값은 230으로 해당 식당은 스시사카우스이다.

그러나 max(favorites)을 제외한 식당 정보는 일식 그룹의 첫번째 행에 있던 하이가쯔네 식당이다.

즉, group by와 select의 실행순서를 고려해야 한다!

 

그래서 with로 최고 즐겨찾기 수 식당만 뽑았고,  테이블 a의 최고 즐겨찾기 수와 테이블b의 즐겨찾기 수가 같아야 됨을 메인쿼리의 where 조건식으로 썼다.

그래야 하이가쯔네가 아닌 스시사카우스가 출력된다.

 

반응형
top