TobeSteady

[GROUP BY] Sub Query, JOIN | 01.응용 본문

Languages/SQL

[GROUP BY] Sub Query, JOIN | 01.응용

NKUT 2023. 3. 10. 11:48

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

 

 

자신있게 풀었으나 틀려버렸다.

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES # 음식 종류, ID, 식당 이름, 즐겨찾기수
FROM REST_INFO # 해당 테이블에서
GROUP BY FOOD_TYPE # 음식 종류별로
HAVING MAX(FAVORITES)# 즐겨찾기 수가 가장 많은
ORDER BY FOOD_TYPE DESC # 음식종류를 기준으로 내림차순 정렬

 

위의 식으로 풀게 되면, 어차피 GROUP BY로 각 음식종류별로 DISTANCE되어 각 음식종류별로 하나의 항목만 남게되어 HAVING 절의 의미가 없어진다.

 


SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES # 음식 종류, ID, 식당 이름, 즐겨찾기수
FROM REST_INFO # 해당 테이블에서
GROUP BY FOOD_TYPE # 음식 종류별로
ORDER BY FOOD_TYPE DESC # 음식종류를 기준으로 내림차순 정렬

두번째로 만약 HAVING 절을 없애고, GROUP BY절로 묶기전에 SELECT절에서 "MAX(FAVORITES) AS FAVORITES"을 하게되더라도 원하는 값을 얻지 못한다.

그 이유는 " MAX(FAVORITES)을 하면 각 그룹의 최댓값을 가져오지만 그것에 일치하는 행 전체를 가져오지 않는다.
즉, 각 그룹의 첫 번째 행에 각 그룹의 FAVORITES 최댓값만 덮어써진 형태가 출력된다."

 

두번째 쿼리식에 의해 도출된 값

 

문제를 풀어보면 알겠지만, 본래 "하이가쯔네"의 FAVORITES는 112였으나 230으로 변경된 것이 확인된다.

이는 동일 음식 종류인 일식에서 MAX(FAVORITES)값을 가진 "스시사카우스"의  230이다.

제시된 REST_INFO 테이블

 


해당 문제에 대해 "SUB_QUERY"통해 답을 구했다.

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;

 

또다른 방식으로 "RIGHT JOIN"을 사용하기도 한다.

SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM REST_INFO AS A
RIGHT JOIN 
(SELECT FOOD_TYPE, max(FAVORITES) as max_favorites FROM REST_INFO group by FOOD_TYPE) AS B
on A.FOOD_TYPE=B.FOOD_TYPE and A.FAVORITES=B.max_favorites
order by FOOD_TYPE DESC