PS/SQL

프로그래머스 그룹별 조건에 맞는 식당 목록 출력하기 SQL(MySQL)

hwajae 2023. 5. 8. 10:21
반응형

문제

다음은 식당의 정보를 담은 REST_INFO테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다. MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.


Column name Type Nullable
MEMBER_ID VARCHAR(100) FALSE
MEMBER_NAME VARCHAR(50) FALSE
TLNO VARCHAR(50) TRUE
GENDER VARCHAR(1) TRUE
DATE_OF_BIRTH DATE TRUE

REST_REVIEW 테이블은 다음과 같으며 REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT, REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.


Column name Type Nullable
REVIEW_ID VARCHAR(10) FALSE
REST_ID VARCHAR(10) TRUE
MEMBER_ID VARCHAR(100) TRUE
REVIEW_SCORE NUMBER TRUE
REVIEW_TEXT VARCHAR(1000) TRUE
REVIEW_DATE DATE TRUE

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

 

 


개념 공부하기

GROUP BY, COUNT GROUP 그룹화 후 COUNT 세기
JOIN, INNER JOIN JOIN : 두 테이블 합치기

 

풀이

문제를 읽으면서 조건들을 분리하며 이해해 본다. 리뷰를 가장 많이 작성한 회원, 그 회원의 전체 리뷰를 가져오고 이름, 텍스트, 작성일을 출력하면 된다.

  1. 우선 리뷰를 가장 많이 작성한 회원 ID 구하기 위해 MEMBER_ID로 그룹화 한 뒤 COUNT 집계를 해준다.
  2. COUNT 기준 내림차순 정렬 된 행들 중 LIMIT 1 사용해 가장 맨 위 행을 골라온다. (빨간 박스)
  3. 골라온 행에서 MEMBER_ID가 가장 리뷰를 많이 작성한 ID이고 그 해당 아이디로 작성된 리뷰들만 분리해준다. (노란 박스)
  4. 리뷰 테이블과 회원 정보 테이블을 MEMBER_ID로 JOIN을 통해 합쳐준다 (보라 박스)
  5. 원하는 이름 정보, 텍스트, 날짜를 출력해준다.
  6. 날짜는 문제에서 원하는 날짜 형식을 맞추기 위해 DATE_FORMAT()을 사용해준다.
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d")
FROM MEMBER_PROFILE M
JOIN (
    SELECT REVIEW_TEXT, REVIEW_DATE, MEMBER_ID
    FROM REST_REVIEW
    WHERE MEMBER_ID = (
        SELECT MEMBER_ID
        FROM REST_REVIEW
        GROUP BY MEMBER_ID
        ORDER BY COUNT(*) DESC
        LIMIT 1)
    ) R
ON R.MEMBER_ID = M.MEMBER_ID
ORDER BY R.REVIEW_DATE, R.REVIEW_TEXT
;

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

프로그래머스

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

programmers.co.kr

반응형