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

[문제풀이] 그룹별 조건에 맞는 식당 목록 출력하기

by kime2 2024. 1. 30.
출처

 

문제

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

문제에 대한 해석

-- 조건: 리뷰를 가장 많이 작성한 회원
-- 조회: 회원 이름, 리뷰 텍스트, 리뷰 작성일
-- 정렬: 리뷰 작성일 오름차순, 리뷰 텍스트 오름차순 

풀이(MYSQL)

select m.member_name,r.review_text,date_format(r.review_date,'%Y-%m-%d')
from member_profile m join rest_review r
on m.member_id = r.member_id
where m.member_id = (select member_id
                     from rest_review
                    group by member_id
                    order by count(1) desc
                    limit 1)
order by r.review_date, r.review_text

 

작동순서

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

 

  1. FROM 절: member_profile테이블과 테이블을 member_id를 기준으로 inner join 
  2. WHERE 절: 서브쿼리에서 조회된 member_id 와 동일한 member_id 와 같을 경우 필터링
    1. 서브쿼리 절: rest_review테이블에서  member_id를 그룹화하여 수를 집계하여 member_id를 조회하는데 내림차순으로 정렬 하여 1개만 출력 = 리뷰수가 가장 많은 member_id 조회
  3. SELECT 절: member_name,review_text,review_date 를 조회
  4. ORDER BY 절: review_date, review_text 오름차순 정렬

다른사람 풀이

WITH most AS ( 
    SELECT MEMBER_ID, COUNT(MEMBER_ID) AMOUNT -- 3. member_id와 그룹별로 집계한 수량을 amount컬럼에 조회
    FROM REST_REVIEW -- 1. REST_REVIEW테이블에서 
    GROUP BY MEMBER_ID -- 2. member_id를 그룹화하여 
    ORDER BY AMOUNT DESC -- 4. 집계한 수량을 내림차순으로 정렬하여 
    LIMIT 1 -- 5. 1개만 출력
)

SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE,'%Y-%m-%d') AS REVIEW_DATE --3.MEMBER_NAME, REVIEW_TEXT,REVIEW_DATE 조회 
FROM REST_REVIEW r
JOIN MEMBER_PROFILE m ON r.MEMBER_ID = m.MEMBER_ID  -- 1. REST_REVIEW와 MEMBER_PROFILE를 MEMBER_ID기준으로 이너조인
WHERE r.MEMBER_ID = (SELECT MEMBER_ID FROM most) -- 2. MEMBER_ID가  most테이블의 MEMBER_ID와 동일한 경우에 필터링
ORDER BY REVIEW_DATE ASC, REVIEW_TEXT ASC  -- 4.  REVIEW_DATE, REVIEW_TEXT 오름차순

배운점

  • 서브쿼리를 활용한 조건절 활용
  • 서브쿼리와 임시테이블 중 어느 방법이 더 최적화 할까?