SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_즐겨찾기가 가장 많은 식당 정보 출력하기

SQL공부 2024. 2. 22. 21:31
반응형

WITH a as (select FOOD_TYPE, MAX(FAVORITES)as MX
FROM REST_INFO
GROUP BY 1)

SELECT r.FOOD_TYPE, r.REST_ID, r.REST_NAME, r.FAVORITES
FROM REST_INFO as r, a
WHERE r.FOOD_TYPE = a.FOOD_TYPE
AND r.FAVORITES= a.MX
GROUP BY 1
ORDER BY 1 desc

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

 

이문제 스트레스 좀 많이 받은 것 같습니다..

일단 중점은 MAX의 사용, 그리고 서브쿼리의 사용을 통한 조인, GROUP BY의 사용, 정렬 정도 입니다.

처음에는 GROUP BY FOOD_TYPE만으로 해결하려 했습니다. 하지만 그렇게 할 경우 REST_ID와 REST_NAME의 값이 따로놀게 됩니다.

MAX FAVORAITES의 값은 정상으로 나오나 그에 맞는 REST ID, REST NAME이 나오지 않는다는 것입니다.

 

예시로 들자면 MAX 값을 가진 행이 4행이라고 칩니다. 그럴 경우 GROUP BY FOOD_TYPE 만으로 풀게 되었을경우

그룹,1,1,4 행이 나오게 됩니다. 2번째와 3번째 컬럼은 상관없이 따로놀게 되는 것이죠. 따라서 이런경우에는 서브쿼리로 MAX 값을 찾아준 다음 조인 시킨 후 기존 테이블의 값과 서브쿼리 테이블 MAX값을 일치 하는지 비교하는 필터를 달아 해결해야합니다. 

서브쿼리로 FOOD TYPE과 MAX(FAVORITES) 만의 값을 뽑아 GROUP 시켜주면 FOOD TYPE을 기준으로 최대값 만을 가진 데이터가 완성됩니다. 

 

그룹1/그룹1의 최대값

그룹2/그룹2의 최대값

그룹3/그룹3의 최대값

 

과 같은 테이블이 구성 되겠죠

그러면 기존 테이블의 FOOD TYPE과 일치하면서 (조인 시키면서 이미 비교된 r.FOOD_TYPE = a.FOOD_TYPE)  그리고 서브쿼리의 MAX 값 (a.MX) 이 일치하는 데이터를 FOOD TYPE으로 그룹 된 데이터(GROUP BY 1) 로 비교하여  추출해 줍니다. 

GROUP BY는 사실 이미 서브쿼리 값이 그룹당 MAX 값 단 하나라서 딱히 써줄 필요는 없지만 좀더 정확한 느낌을 주기 위해 썼습니다.

그 후 ORDER BY로 정렬해 줍니다.

 

풀다가 저도 헷갈려서 시간이 걸렷네요... 시험을 칠때 막상 풀어놓고 틀리면 뭔가 해탈할 문제 같습니다.

풀고나서 전체데이터랑 한번 비교해보는 습관도 길러야겠습니다.

반응형