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

야금야금 공부·2023년 3월 27일

SQL

목록 보기
1/28
post-thumbnail

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

문제 설명

다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

Column nameTypeNullable
REST_IDVARCHAR(5)FALSE
REST_NAMEVARCHAR(50)FALSE
FOOD_TYPEVARCHAR(20)TRUE
VIEWSNUMBERTRUE
FAVORITESNUMBERTRUE
PARKING_LOTVARCHAR(1)TRUE
ADDRESSVARCHAR(100)TRUE
TELVARCHAR(100)TRUE

문제

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

예시

REST_INFO 테이블이 다음과 같을 때

REST_IDREST_NAMEFOOD_TYPEVIEWSFAVORITESPARKING_LOTADDRESS TEL
00001은돼지식당한식1150345734N서울특별시 중구 다산로 149
00002하이가쯔네일식120034112N서울시 중구 신당동 375-21
00003따띠따띠뜨양식1234023102N서울시 강남구 신사동 627-3 1F
00004스시사카우스일식1522074230N서울시 서울시 강남구 신사동
00005코슌스일식15301123N서울특별시 강남구 언주로153길

SQL을 실행하면 다음과 같이 출력되어야 합니다.

FOOD_TYPEREST_IDREST_NAMEFAVORITES
한식00001은돼지식당734
일식00004스시사카우스230
양식00003따띠따띠뜨102


문제 풀이

내가 푼 풀이

ORDER BY를 사용해 정렬하고, GROUP BY를 통해 묶어 주었는데 통과하지 못했다.

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

틀린 이유

GROUP BY로 묶으면 가장 상단에 있는 데이터들을 임의로 가져오게 된다고 한다.
즉, 여기서 GROUP BY FOOD_TYPE으로 묶으면 한식의 맨 첫번째, 일식의 맨 첫번째, .. 를 가져온다. 문제에서 요구하는 즐겨찾기 수가 가장 많은 식당이 아닌 테이블의 가장 상단의 식당 정보들을 가져오게 되는 것.

프로그래머스에 있던 틀린 이유 설명

SQL 쿼리에는 실행 순서가 존재하는데, GROUP BY 이후에 MAX를 진행하면 테이블 최상단 값을 가져와 거기서 최대값을 찾아 준다.

정답 코드

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;


쿼리 실행 순서

  1. FROM (+JOIN) : 가장 먼저 실행됨
  2. WHERE
  3. GROUP BY
  4. HAVING
    그루핑 후 각 그룹에 적용되는 조건 절. HAVING 절의 조건을 WHERE 절에도 사용할 수 있다면 WHERE에 사용하는 것이 바람직하다.
  5. SELECT
  6. ORDER BY
  7. LIMIT

참고 : Jae Honey 블로그

0개의 댓글