일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 큐
- 분할 정복을 이용한 거듭제곱
- 패스트캠퍼스혁펜하임
- 백준 13172
- 백준 Σ 파이썬
- 혁펜하임강의후기
- 수학
- 다이나익 프로그래밍
- 백준 시그마
- AIDEEPDIVE
- 알고리즘
- 백준 13172 파이썬
- 자료구조
- DP
- 혁펜하임AI
- mysql
- 다이나믹프로그래밍
- 그리디알고리즘
- 구현
- 혁펜하임
- 패스트캠퍼스
- AI강의
- 코딩테스트
- 혁펜하임강의
- 백준 구간 합 구하기 5 파이썬
- 모듈로 곱셈 역원
- 백준 Σ
- 백준 구간 합 구하기 5
- 분할 정복
- 백준 시그마 파이썬
- Today
- Total
MingyuPark
[MySQL] 프로그래머스 - 서울에 위치한 식당 목록 출력하기 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131118
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
REST_INFO 테이블과 REST_REVIEW 테이블에 대해서 JOIN 을 수행해야 한다.
각 식당에 대해서 review가 존재하기 때문에 REST_INFO 테이블에 대해서 REST_REVIEW 테이블을 JOIN한다.
이 때, 리뷰가 존재하지 않는 식당은 제외하기 위해 INNER JOIN을 사용한다.
이 때, 식당별로 review_score 의 평균을 계산해야 한다. 따라서 ROUND(AVG(B.review_score)) 명령어를 통해 review_score의 평균을 계산한다. 이 때, 평균을 계산하기 위한 grouping이 필요한데, 이것을 지정해주는 것이 GROUP BY A.rest.id 절이다.
그리고 문제에서 제시한 조건에 맞는 데이터만 선택해야 한다. 서울에 위치한다는 조건이 있기 때문에 주소지가 서울이면 된다. 주소지가 서울인 경우 '서울특별시 ~~'의 형태로 되어있다. 더 간단하게 표현하면 '서울 ~ '만 찾아도 된다.
따라서 HAVING A.address LIKE '서울%' 절을 통해서 서울에 위치하는 식당들만 계산한다. 이 때 JOIN을 수행했기 때문에 하나의 테이블이 아니게 되었고, 따라서 WHERE 대신 HAVING을 사용해야 한다.
마지막으로 식당별 review_score의 평균의 내림차순, 만약 review_score의 평균이 동일하다면 favorites의 내림차순으로 정렬하라고 했기 때문에 ORDER BY를 사용해서 정렬해준다.
Solution
SELECT
A.rest_id,
A.rest_name,
A.food_type,
A.favorites,
A.address,
ROUND(AVG(B.review_score), 2) AS score
FROM REST_INFO AS A
INNER JOIN REST_REVIEW AS B
ON A.rest_id = B.rest_id
GROUP BY A.rest_id
HAVING A.address LIKE '서울%'
ORDER BY SCORE DESC, A.favorites DESC