OkBublewrap

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

개발/SQL

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

옥뽁뽁 2023. 3. 13. 13:36

<문제>

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

 

<예시>

REST_ID REST_NAME FOOD_TYPE
00001 은돼지식당 한식
00002 하이가쯔네 일식
00003 따띠따띠뜨 양식
00004 스시사카우스 일식
00005 코슌스 일식

<예시 결과>

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

 

<풀이>

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
ORDER BY FOOD_TYPE DESC
FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 00001 은돼지식당 734
한식 00024 농실가찹쌀순대 12
한식 00022 군자네 101
한식 00021 강수곱창 210
한식 00020 신동태 550
한식 00017 방화동쭈꾸미마을 80
한식 00009 숙성돼지 143
한식 00010 맷돌우리콩감자탕 243
한식 00011 부암갈비 150
한식 00012 만다복 10
한식 00013 은성보쌈 10
한식 00014 동명항생선숯불구이 53
한식 00016 오대산산채전문점 230
중식 00015 만정 20
일식 00002 하이가쯔네 112
일식 00023 싹쓰리 42
일식 00005 코슌스 123
일식 00004 스시사카우스 230
양식 00007 소마바이 65
양식 00006 지아스나폴리 50
양식 00003 따띠따띠뜨 102
분식 00008 애플우스 151
분식 00018 가나안 51
분식 00019 에버그린 130
분식 00025 별미진 10

결과물은 

FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 00001 은돼지식당 734
중식 00015 만정 20
일식 00004 스시사카우스 230
양식 00003 따띠따띠뜨 102
분식 00008 애플우스 151

이런 식으로 나와야 정답 처리가 된다. GROUP BY로 MAX를 했을 때 보면

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
FOOD_TYPE REST_ID REST_NAME MAX(FAVORITES)
한식 00001 은돼지식당 734
중식 00015 만정 20
일식 00002 하이가쯔네 230
양식 00003 따띠따띠뜨 102
분식 00008 애플우스 151

일식 부분은 보면 MAX부분은 잘 나온 것을 볼 수 있는데 REST_ID, REST_NAME이 다른 것을 볼 수 가 있다.

MAX부분을 FOOD_TYPE으로 매칭을 해서 코드를 작성을 하면 될 것 같다.

 

1)

SELECT MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
MAX(FAVORITES)
734
230
102
151
20

FOOD_TYPE별 최대값을 출력을 했다.

2)

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE FAVORITES IN (
   SELECT MAX(FAVORITES)
   FROM REST_INFO
   GROUP BY FOOD_TYPE
)
FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 00001 은돼지식당 734
양식 00003 따띠따띠뜨 102
일식 00004 스시사카우스 230
분식 00008 애플우스 151
중식 00015 만정 20
한식 00016 오대산산채전문점 230

이런식으로 출력을 하면 230이 한식에도 일식에도 있기 때문에 한식에 두개가 출력이 된다. 

 

3)

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE  
FAVORITES IN (
   SELECT MAX(FAVORITES)
   FROM REST_INFO
   GROUP BY FOOD_TYPE
)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 00001 은돼지식당 734
중식 00015 만정 20
일식 00004 스시사카우스 230
양식 00003 따띠따띠뜨 102
분식 00008 애플우스 151

GROUP BY를 한번더 써서 한식을 하나만 쓰게 했다. 이렇게 되면 MAX의 FAVORITES에 대응할 수 없는 것 같다.

이부분은 SELECT 절에 MAX(FAVORITES)를 써서 정리하면 올바르게 나올 것 같다. 위의 쿼리도 정답처리가 된다.

 

4)

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