본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 즐겨찾기가 가장 많은 식당 정보 출력하기-window(?)

by kime2 2024. 1. 11.
출처

 

문제

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

 

문제에 대한 해석

음식 종류별 즐겨찾기 수가 가장 많은 식당의 정보

풀이1(MYSQL)-서브쿼리,자기참조

select a.food_type,  (select rest_id
     from rest_info 
     where food_type = a.food_type
     order by favorites desc
     limit 1) as rest_id,
    (select rest_name
     from rest_info 
     where food_type = a.food_type
     order by favorites desc
     limit 1) as rest_name,
     max(favorites) max_favorites
from rest_info a
group by food_type
order by food_type desc

 

풀이 방법

 

https://kime2pan.tistory.com/21

해당 문제는 그룹함수를 사용하여 집계된 데이터를 추출하는 것이다. 따라서 저번에 공부한 서브쿼리-자기참조를 사용해 보았다.

단, 집계함수를 사용한 컬럼(즐겨찾기 수)외에 2개의 데이터(식당이름, 식당 아이디)를 조회해야 하므로 각 2개씩의 서브쿼리를 만들었다.

 

[Question] 서브쿼리와 JOIN-완

Q. 서브쿼리_자기참조는 언제 사용하는가? A. 그룹함수와 집계함수를 사용할 때 집계한 값과 데이터를 조회하기 위해서! https://school.programmers.co.kr/learn/courses/30/lessons/131116 예시2. FOOD_PRODUCT 테이블

kime2pan.tistory.com

풀이2-with절

with temp as
(
select food_type, max(favorites) as max_favorites
from rest_info
group by food_type
) -- 음식 종류별 즐겨찾기가 가장 많은 걸 조회
select re.food_type, re.rest_id, re.rest_name,re.favorites
from rest_info re join temp t 
on re.food_type = t.food_type -- 각 음식타입마다
and re.favorites= t.max_favorites -- 즐겨찾기 수가 같은 경우 조인
order by re.food_type desc

풀이3 -window

SELECT FOOD_TYPE,REST_ID,REST_NAME,FAVORITES
FROM
(SELECT 
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES,
    RANK() OVER(PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS BB
FROM REST_INFO
ORDER BY 1,4 DESC) AS NEW
WHERE BB = 1 -- ? 
ORDER BY 1 DESC

배운점