mysql 문제풀이/easy

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

gooreumsea 2023. 7. 14. 03:20

습득한 점:

서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 쿼리를 작성하는 것이니
조회되는 쿼리는 모두 서울에 위치한 식당이어야 하고,

 

예상되는 테이블 형태는 아래와 같으므로 (적기만 하면 되는 컬럼은 제외했음)

문제에서는 식당 이름에 대해서 그룹화 하란 말이 없었지만, 결국은 식당 별 리뷰 평균을 구하는 것과 같다.

 

고로, 문제에서 ~~~ 그룹 별 이라는 말이 없어도, 문제에서 원하는 테이블 형태를 예상해서

원하는 컬럼에 GROUP BY 를 붙여 계산해도 된다.

식당 이름 리뷰 점수 >>> 식당이름 리뷰평균
a 4.5 >>> a 4.50
b 3 >>> b 3.33
b 4 >>> c 3.50
b 3 >>>    
c 3 >>>    
c 4 >>>    

 

 

 

 

문제:

REST_INFO와 REST_REVIEW 테이블에서

서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 쿼리 작성.

 

리뷰 평균점수는 소수점 세 번째 자리에서 반올림,

결과는 평균점수를 기준으로 내림차순 정렬,

평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬

 

 

 

문제파악:

리뷰 평균점수를 구하는 산술계산 이외에는 크게 어려운 점이 없는 문제였다.

식당 별로 그룹화하라는 언급은 없었지만 REST_ID 별로 그룹화 한 뒤, REVIEW_SCORE에 대해 평균값을 계산하면 된다.

또한 테이블을 붙이는 겸, WITH 구문+ LEFT 함수 활용해서 미리 서울에 위치하는 식당만 뽑을 수 있도록 테이블을 새로 만들고 이를
REST_REVIEW 테이블과 조인했다.

 

WHERE 구문에는 LEFT를 사용했는데, ADDRESS 컬럼의 앞 글자 2개만 따기 위해 사용했다.

전체 문자열 중 "서울"이 들어가는 조건을 활용하는 경우에,

만약 행정구역 이름 (~구 혹은 ~로) 이후에 이어지는 명칭들에서 "서울"이 들어가 있으면

서울시는 아니지만 빌딩 이름 혹은 지점이름에 "서울"이 들어간다는 이유로 결과값이 걸려들 수 있어서 LEFT를 사용했다.

 

실제로 부산에도 서울빌딩이라는 건물이 있고,

서울에도 마곡 광안리라는 음식점이 있다.

아래의 아브뉴프랑이 아닌, "아브뉴서울" 이라고 적혀있으면 결과값에 걸려드는 것이다.

다소 억지스럽겠지만, 나는 절대 데이터를 믿으면 안된다고 생각한다.

ADDRESS
서울특별시 중구 다산로 149
서울시 강남구 신사동 627-27
서울특별시 강남구 언주로153길
경기도 수원시 영통구 센트럴타운로 85 아브뉴프랑 1F
경기도 수원시 영통구 센트럴타운로 85 아브뉴프랑 2F

 

 

 

 

풀이:

 

WITH SEOUL_REST AS (
    SELECT *
    FROM REST_INFO
    WHERE LEFT(ADDRESS,2) ='서울'
                )

SELECT SR.REST_ID
     , REST_NAME
     , FOOD_TYPE
     , FAVORITES
     , ADDRESS
     , ROUND(AVG(REVIEW_SCORE),2) AS SCORE
     
FROM SEOUL_REST AS SR
     INNER JOIN REST_REVIEW AS RR ON SR.REST_ID = RR.REST_ID

GROUP BY SR.REST_ID
ORDER BY SCORE DESC