[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기

yenpkr·2025년 3월 4일
0

sql

목록 보기
46/91

문제

제출

SELECT a.member_name,b.review_text,date_format(b.review_date,'%Y-%m-%d') REVIEW_DATE
from member_profile a
join rest_review b
on a.member_id = b.member_id
join (select member_id,count(review_text) cnt from rest_review group by member_id) c
on a.member_id = c.member_id
where cnt = (select count(cnt) cnt from rest_review group by member_id order by 1 desc limit 1)
order by 3 asc,2 asc

📌 새로 배운 내용

✅ WITH 절

SQL에서 임시 테이블(CTE, Common Table Expression)을 만드는 방법
복잡한 쿼리를 더 읽기 쉽게 만들고, 같은 서브쿼리를 여러 번 사용해야 할 때 코드 반복을 줄여준다.

WITH 임시테이블명 AS (
    원하는 쿼리 (SELECT ...)
)
SELECT * FROM 임시테이블명;

from 절에서 사용한다.
WITH절을 확장하면 재귀 쿼리(계층 구조 탐색)도 가능하다. (반복문 기능)

더 간단한 방법 없을까?

WITH 절 사용

WITH 절은 공통 테이블 표현식(CTE)을 정의하는 데 사용되며, 쿼리 내에서 여러 번 사용될 수 있는 서브쿼리를 미리 정의해 두는 방법이다.

WITH member_review_count AS (
    SELECT member_id, COUNT(review_text) AS cnt
    FROM rest_review
    GROUP BY member_id
)

SELECT a.member_name, b.review_text, DATE_FORMAT(b.review_date, '%Y-%m-%d') AS REVIEW_DATE
FROM member_profile a
JOIN rest_review b ON a.member_id = b.member_id
JOIN member_review_count c ON a.member_id = c.member_id
WHERE c.cnt = (
    SELECT MAX(cnt)
    FROM member_review_count
)
ORDER BY REVIEW_DATE ASC, b.review_text ASC;
SELECT b.member_name,a.review_text,date_format(a.review_date,'%Y-%m-%d') REVIEW_DATE
from rest_review a
left join MEMBER_PROFILE b
on a.member_id = b.member_id
where a.member_id = (select member_id from rest_review group by member_id order by count(*) desc limit 1)
order by 3 asc,2 asc

테스트 케이스에서는 가장 많이 리뷰를 쓴 작성자가 3명이었는데, 문제가 잘못되었는지 한명에 대해서만 추출해도 정답이라고 나왔다. 뭔가 문제가 잘못된 듯?

0개의 댓글