𝙎𝙌𝙇

[MySQL] GROUP BY 시 주의할 점

콜라맛갈비 2023. 1. 16. 20:21
728x90

 

※ GROUP BY를 사용할 때 집계 함수를 사용하지 않아 임의의 값 중 어떤 값을 반환해야 할 지 모르는 필드가 존재하면

가장 상단에 있는 데이터들을 임의로 가져옴!

 

 GROUP BY 구의 기준이 되는 필드가 아니거나 집계 함수를 통해 어떤 값을 반환해야 할 지 결정해주지 않은 필드 SELECT 구에 사용할 경우 문법적으로 틀린 SQL 구문

 

 

EX) 즐겨찾기가 가장 많은 식당 정보 출력하기 - 오류

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) FAVORITES
FROM REST_INFO 
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC

FOOD_TYPE으로 GROUP BY를 사용,

FOOD_TYPE, MAX(FAVORITES)는 반환해야 하는 값이 명확하지만,

REST_ID, REST_NAME에 대해서는 반환값이 모호하기 때문에

문제에서 요구하는 즐겨찾기수가 가장 많은 식당의 정보가 아닌 테이블에서 가장 상단의 식당 정보를 가져옴!

 

실제 FOOD_TYPE이 일식이고, 즐겨찾기 230인 식당 번호는 00004, 식당 이름은 스시사카우스이지만

위의 경우, REST_ID와 REST_NAME이 모두 잘못 들어가 있음

 

 

 

* 1. GROUP BY의 기준인 FOOD_TYPE과  2. 집계합수 MAX(FAVORITES)만 SELECT 하는 경우, 올바르게 GROUP BY 됨

SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE

 

 

 

 

EX) 즐겨찾기가 가장 많은 식당 정보 출력하기 - 정답

SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM REST_INFO A JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) B -- B: 각 카테고리별 최대 FAVORITES
ON A.FAVORITES = B.FAVORITES AND A.FOOD_TYPE = B.FOOD_TYPE -- B에 해당하는 컬럼만 남기기 (교집합)
ORDER BY FOOD_TYPE DESC

FOOD_TYPE과 FAVORTIES에 해당하는

올바른 REST_ID, REST_NAME를 구하기 위해선 JOIN 사용 필요

 

 

728x90