https://school.programmers.co.kr/learn/courses/30/lessons/131123
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM
(SELECT * FROM REST_INFO GROUP BY FOOD_TYPE HAVING FAVORITES = MAX(FAVORITES)) BEST
ORDER BY FOOD_TYPE DESC;
내 계획은 각 FOOD_TYPE 그룹에서 FAVORITES으로 MAX(FAVORITES)값을 갖는 데이터만을 뽑아내 테이블을 만들고, 그 테이블에서 필요한 정보만 뽑아내고 정렬해 반환! 하고자 하는 멋진 계획
하지만 두번째 SELECT(서브쿼리)는 잘못되었다. 모든 필드를 가져오도록 했는데, GROUP BY를 사용했을 때 저 위치에 올 수 있는 필드는 GROUP BY의 기준 필드, 그리고 집계함수가 사용된 필드 들이다. 그러니까 그에 포함되지 않는 필드도 포함된 *는 잘못됐다.
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES FROM REST_INFO A
INNER JOIN (SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE) B
ON A.FOOD_TYPE=B.FOOD_TYPE AND A.FAVORITES = B.FAVORITES
ORDER BY FOOD_TYPE DESC;
그래서 어떻게 해결할 수 있을지 생각하다가 JOIN을 사용하기로 했다.
먼저 GROUP BY로 MAX(FAVORITES)값과 FOOD_TYPE을 필드 값으로 갖는 테이블을 만들고 이를 기존 테이블과 INNER JOIN 한다. 이 과정에서 JOIN의 기준을 FOOD_TYPE이 같으며, FAVORITES이 같다! 로 뒀으니 이에 해당하는 데이터들만 조회될 것이다.
여기서 새롭게 안 것은 JOIN에서 ON에 여러개의 조건을 줄 수 있다는 점이다!
이 문제때문에 GROUP BY가 굉장히 어렵게 느껴졌었는데 내가 뭘 잘못한건지 뚜렷하게 알고나니 조금 나아졌다. 아자!
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
GROUP BY 1
HAVING FAVORITES = MAX(FAVORITES)
ORDER BY 1 DESC;
다시 풀 때 이렇게 간단하게 풀려고 했는데, 위 내용을 다 까먹고있었던 셈이다.
HAVING에서라도 집계함수를 사용하면 되는거 아닌가? 라고 생각했었는데..
SELECT문에서 조회할 필드가 GROUP BY의 기준이 되는 필드 혹은 집계함수가 적용된 필드여야하는거다.
참고