SQL

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

지니지니하지니 2022. 12. 15. 16:13

https://school.programmers.co.kr/learn/courses/30/lessons/131123?language=oracle 

 

프로그래머스

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

programmers.co.kr


테이블 정보

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

컬럼 정보

음식 종류(food_type), ID(rest_id), 식당 이름(rest_name), 즐겨찾기수(favorites)


문제 설명

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


풀이 과정

음식종류별로 즐겨찾기수가 가장 많은

서브 쿼리를 통해 음식 종류별로 즐겨찾기수가 가장 많은 컬럼을 분류해놓은 테이블이 필요한 상황

select food_type, max(favorites) max_favorites
from rest_info
group by food_type

<서브 쿼리를 통해 만들어진 테이블>

food_type max_favorites
한식 734
일식 230
양식 102
분식 151
중식 20

rest_info에서 위의 테이블과 food_type이 같고 favorites 가 max_favorites와 같은 컬럼들만 뽑아오면 된다.

where 절로 조건을 비교해도 되고 inner join을 통해서도 가능하다

 

음식 종류, ID, 식당 이름, 즐겨찾기수를 조회

select food_type, rest_id, rest_name, favorites

 

음식 종류를 기준으로 내림차순 정렬

order by food_type desc 로 간단히 가능!


정답

MySQL

where in을 사용한 방법

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)  -- 여러개의 서브쿼리가 생기기 때문에 in으로 처리해줘야함
order by food_type desc

join 을 사용한 방법

select food_type, rest_id, rest_name, favorites
from rest_info t1
join (
	select food_type, max(favorites) as favorites
    from rest_info
    group by food_type
) t2 -- 각 타입별 최대 favorites
	on t1.favorites = t2.favorites and t1.food_type = t2.food_type
order by food_type desc

 

Oracle

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)  -- 여러개의 서브쿼리가 생기기 때문에 in으로 처리해줘야함
order by food_type desc

MySQL 과 동일