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

kiki·2024년 1월 6일
0

프로그래머스

목록 보기
45/78

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/131123

문제 설명

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

1차 시도 - 실패

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의 기준 필드, 그리고 집계함수가 사용된 필드 들이다. 그러니까 그에 포함되지 않는 필드도 포함된 *는 잘못됐다.

2차 시도 - 통과

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가 굉장히 어렵게 느껴졌었는데 내가 뭘 잘못한건지 뚜렷하게 알고나니 조금 나아졌다. 아자!

정리

  • GROUP BY 조회 필드: GROUP BY를 이용한 조회 시 적용 가능한 필드는 GROUP BY의 기준이 되는 필드, 혹은 집계함수가 적용된 필드이다. 그 외의 것을 조회하려하면 오류!
  • JOIN ON 여러개: JOIN 시 ON의 조건(??)도 AND, OR 등을 사용해 여러개를 지정할 수 있다!

추가 24.03.08

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의 기준이 되는 필드 혹은 집계함수가 적용된 필드여야하는거다.
참고

0개의 댓글