새소식

Programmers Coding Test/MySQL

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

  • -

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

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1)  문제

다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 

이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

 

Column name Type Nullable
REST_ID VARCHAR(5) FALSE
REST_NAME VARCHAR(50) FALSE
FOOD_TYPE VARCHAR(20) TRUE
VIEWS NUMBER TRUE
FAVORITES NUMBER TRUE
PARKING_LOT VARCHAR(1) TRUE
ADDRESS VARCHAR(100) TRUE
TEL VARCHAR(100) TRUE

 

 

 

 

 

2)  예시

 

예를 들어, REST_INFO 테이블이 아래와 같다면

 

REST_ID REST_NAME FOOD_TYPE VIEWS FAVORITES PARKING_LOT ADDRESS TEL
00001 은돼지식당 한식 1,150,345 734 N 서울특별시 중구 다산로 149 010-4484-8751
00002 하이가쯔네 일식 120,034 112 N 서울시 중구 신당동 375-21 NULL
00003 따띠따띠뜨 양식 1,234,023 102 N 서울시 강남구 신사동 627-3 1F 02-6397-1023
00004 스시사카우스 일식 1,522,074 230 N 서울시 강남구 신사동 627-27 010-9394-2554
00005 코슌스 일식 15,301 123 N 서울특별시 강남구 언주로153길 010-1315-8729

 

 

 

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

 

 

 

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

 

 

 

 

 

 

 

3)  풀이


 SQL 논리적 실행 순서
① FROM: 테이블 결합 및 필요한 데이터 검색.
② WHERE: 행을 필터링.
③ GROUP BY: 그룹화된 데이터 생성.
④ HAVING: 그룹화된 데이터에 대한 조건 검사.
⑤ SELECT: 열 선택 및 계산.
⑥ ORDER BY: 결과 정렬.

 

 


1. 테이블에서 음식종류, ID, 식당이름, 즐겨찾기수를 조회합니다.

● SELECT FOOD_TYPE, REST_ID,REST_NAME, FAVORITES FROM REST_INFO

 

 

 

 

2. WHERE 조건문에 서브쿼리를 이용하여 즐겨찾기수가 제일 많은 음식 종류를 구해내고, 그 구한값을 조건으로 합니다.

● WHERE (FOOD_TYPE, FAVORITES) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE)

 

※ WHERE(A) IN (B)

B값과 일치하는 A열을 조건으로 합니다.

 

※ 만약
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE
라고 했으면 어떻게 되었을까?

위 구문을 사용했다면, 음식 타입별로 최대 즐겨찾기수를 찾는 것은 맞지만!! 어떤 REST_ID 및 NAME이 해당 최댓값에 대응하는지는 찾지 못합니다.

GROUB BY절은 집계 함수를 사용한 열과 나머지 열 간의 관계를 설정하지 않으므로 데이터베이스에서 어떤 REST_ID와 REST_NAME 값을 선택해야 할지 알 수 없게 됩니다.

 

/// 1번 아이디의 소나무식당이 돼지갈비로 유명하고, 즐겨찾기 500개 ///
만약 돼지갈비가 즐겨찾기 500개로 가장 많은 음식 타입이라할지라도,

이게 소나무식당인지, 감나무식당인지, 음식점아이디가 1번인지 5번인지 대응되지 못한다는 것입니다.

 

따라서, 서브쿼리문을 이용하여 (음식 종류, 즐겨찾기)를 조건으로 하여

테이블에서 (돼지갈비, 500개)를 찾게되니 그게 소나무식당이고 1번 아이디식당임을 알 수 있다는 것입니다.


※ MAX(A)

A 중 최대값을 반환하는 함수입니다.

 

 


3. 음식 종류를 기준으로 내림차순 정렬합니다.
ORDER BY FOOD_TYPE DESC;

 

 

 

 

 

4)  코드

 

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;

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.