MingyuPark

[MySQL] 프로그래머스 - 서울에 위치한 식당 목록 출력하기 본문

SQL

[MySQL] 프로그래머스 - 서울에 위치한 식당 목록 출력하기

MingyuPark 2022. 10. 14. 22:54

문제 

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

 

Comments