LV3. 서울에 위치한 식당 목록 출력하기
문제 )
REST_INFO
와REST_REVIEW
테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수(SCORE)를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
(자세한 테이블 정보는 프로그래머스에 있습니다.)
# 리뷰평균점수 소수점 3번째 자리 (컬럼명: SCORE)
# 평균점수 내림차순, 즐겨찾기 내림차순
WITH score AS( SELECT REST_ID
, ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID
)
SELECT b.REST_ID
, b.REST_NAME
, b.FOOD_TYPE
, b.FAVORITES
, b.ADDRESS
, a.SCORE
FROM score a
LEFT JOIN REST_INFO b ON a.REST_ID = b.REST_ID
WHERE ADDRESS LIKE "서울%"
ORDER BY SCORE DESC, FAVORITES DESC
시나리오
REST_REVIEW
테이블에서 필요한 정보는 REST_ID 와 리뷰 평균 점수(SCORE)입니다. 이 둘을 구한 테이블을score
라는 이름의 서브쿼리로 만들었습니다. 또한 모든 식당 정보가 아니라 평점이 존재하는 서울 식당 정보만 필요하니score
테이블을 기준으로REST_INFO
테이블과 결합 한후 "서울%"로 시작하는 식당만 뽑으면 정답입니다.
# 첫번째 시도 했을 때 with절을 이용하여 결합하여 줬었는데
# 굳이 그럴필요 없었다!
SELECT REST_ID
, REST_NAME
, FOOD_TYPE
, FAVORITES
, ADDRESS
, round(avg(REVIEW_SCORE),2) as SCORE
FROM REST_INFO i JOIN REST_REVIEW r USING (REST_ID)
WHERE ADDRESS LIKE '서울%'
GROUP BY REST_ID
order by SCORE desc, FAVORITES desc
여기서 JOIN을 할때 보통
ON
을 쓰기 마련인데,USING
을 이용했다. 그이유는?
JOIN 할 두개의 테이블에 같은 컬럼이 있는 경우 USING을 쓴다! 다른 경우 ON을 사용!
두번째 방법의 경우 일단 REVIEW를 다 JOIN 시키고 리뷰평균을 구하는 방법이고
내가 쓴 첫번째 방법은 선 평균 SCORE 후 결합 방법을 이용한 방법이다!