https://school.programmers.co.kr/learn/courses/30/lessons/131123
1. 서론
약간 복잡하긴 한데 그렇게 어려운 문제는 아니다. (하지만 쉽지 않다...)
2. 문제 풀이
REST_INFO: 식당의 정보를 담은 테이블
테이블 구조:
REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL
(식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호)
Q. REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해 주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해 주세요.
음식종류별로 즐겨찾기 수가 가장 많은 딱 한 식당만 출력하는 게 문제다.
그러기 위해서는 음식종류별로 즐겨찾기 수를 구해야 하고, 그중에서 가장 큰 값을 구해야 한다.
두 가지를 구해서 그 조건을 연결해야 하기 때문에 서브쿼리를 사용했다.
먼저 그룹별로 최고 즐겨찾기 값이 제일 큰 값을 구하고
그 값과 그룹별로 출력할 때 즐겨찾기 값이 같은 것을 매치시켜 그 컬럼을 조건에 맞춰서 출력한다.
3. 코드 설명
select r.food_type, rest_id, rest_name, favorites
from rest_info r, (select food_type, max(favorites) as f from rest_info group by food_type) x
where r.favorites = x.f
group by food_type
order by food_type desc;
서브쿼리를 이용해 음식종류 그룹별로 favorites의 최댓값을 구했다.
그리고 그 값과 즐겨찾기의 값이 일치하는 컬럼을 선택해 출력했다.
틀린 코드
select food_type, rest_id, rest_name, max(favorites) as favorites
from rest_info
group by food_type
order by food_type desc;
이 코드로 돌리면 테케는 위의 코드와 똑같이 나오는데 다른 케이스에서 틀리는지 틀렸다고 나온다.
왜냐하면 이 코드는 언뜻 맞을 수도 있으나 favorites의 값 중 최댓값을 구하기 때문에 food_type별 최댓값이 아닐 수도 있기 때문이다.
아니면 그 값이 여러 개이거나?
(추측임)
'SQL' 카테고리의 다른 글
[MySQL] 대여 기록이 존재하는 자동차 리스트 구하기 (0) | 2024.07.12 |
---|---|
[MySQL] 물고기 종류 별 대어 찾기 (0) | 2024.07.11 |
[MySQL] 프로그래머스 카테고리 별 도서 판매량 집계하기(+Oracle) (0) | 2023.01.17 |
[MySQL] 프로그래머스 카테고리 별 상품 개수 구하기 (0) | 2023.01.13 |
[MySQL] 프로그래머스 가격대 별 상품 개수 구하기 (0) | 2023.01.12 |