본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 서울에 위치한 식당 목록 출력하기

by kime2 2024. 1. 25.
출처
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

문제에 대한 해석

-- 조건: 서울에 위치한 식당들
-- 조회: 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수
-- 출력: 리뷰 평균점수는 소수점 세 번째 자리에서 반올림
-- 정렬: 평균점수 내림차순 , 즐겨찾기 내림차순

 

풀이(MYSQL)

with temp as (
    select i.rest_id, i.rest_name, i.food_type, i.FAVORITES,i.address,avg(r.review_score) avg_review
from rest_info i join rest_review r on i.rest_id = r.rest_id
where i.address like '서울%'
group by i.rest_id
             )
select rest_id, rest_name, food_type, FAVORITES, address, round(avg_review,2) avg_review
from temp
order by avg_review desc, FAVORITES desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. WITH 절: rest_info 와 rest_review 테이블을 rest_id로 조인하여 address가 like '서울%인 것만 필터링 후  rest_id별로 그룸화 한다. rest_id에는 한개의 rest_name, food_type, FAVORITES이 있고 복수의 review가 있어서 avg집계는 eview에만 적용하여 조회한다
  2. FROM 절: with절의 임시테이블에서 
  3. SELECT 절: rest_id, rest_name, food_type, FAVORITES, address와 평균집계된 avg_review를 반올림한 2째자리 까지 나타낸다
  4. ORDER BY 절: avg_review,FAVORITES 내림차순으로 정렬

다른사람 풀이

SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE), 2) SCORE
FROM        REST_INFO   A
JOIN   REST_REVIEW B
ON          A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE '서울%'
GROUP BY A.REST_ID
ORDER BY SCORE DESC,
         A.FAVORITES DESC

배운점

  • 집계함수와 반올림함수를 동시에 사용 가능하다
  • 원칙적으로 조회하는 컬럼 중 집계하지 않는 컬럼의 의 수와 그룹화 하는 컬럼의 수는 동일하지만 rest_id의 경우 고유id당 컬럼의 단 한개씩의 데이터가 존재하므로 그룹함수를 적용해도 조회되는 데이터는 동일하다