👉 오늘 한 일
프로그래머스 SQL
1. 그룹별 조건에 맞는 식당 목록 출력하기 💡
- lv 4, JOIN
- 리뷰를 가장 많이 작성한 회원 아이디를 간단하게 조회할 방법이 떠오르지 않아 서브쿼리를 남발했다.. 정답이긴 하지만 좋지 않은 풀이인듯 하다
SELECT m.member_name,
r.review_text,
DATE_FORMAT(r.review_date, "%Y-%m-%d") AS review_date
FROM member_profile m
JOIN rest_review r
ON m.member_id = r.member_id
WHERE r.member_id IN(
SELECT member_id
FROM rest_review
GROUP BY member_id
HAVING COUNT(member_id) = (
SELECT MAX(cnt)
FROM(
SELECT member_id,
COUNT(*) AS cnt
FROM rest_review
GROUP BY member_id) a)
)
ORDER BY review_date, review_text
- 다른 사람의 풀이 중 가장 깔끔한 풀이를 참고해봤다.
- 기본적인 틀은 내 풀이와 비슷하나 가장 많은 횟수를 가져올 때 두 번의 서브쿼리로 묶는 것이 아니라 ORDER BY와 LIMIT를 사용해서 최대 횟수를 구했다.
- ❗ 다시 확인해보니 이 답안은 가장 많은 리뷰를 쓴 한 명만 가져온다..! 이 문제에서는 리뷰를 가장 많이 쓴 사람이 3회씩 3명으로 총 9개의 레코드를 가져와야 하는데 이 답안은 3개의 레코드만 가져온다. 하지만 정답 처리가 되는걸 보니 중복 정답으로 인정 되나보다.
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
WHERE A.MEMBER_ID = (
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT
- 또 다른 풀이(window function
RANK() OVER()
사용)
SELECT B.MEMBER_NAME, A.REVIEW_TEXT, A.REVIEW_DATE
FROM REST_REVIEW A
JOIN (
SELECT R.MEMBER_ID, M.MEMBER_NAME, RANK() OVER(ORDER BY CNT DESC) AS RANKING
FROM (
SELECT *, COUNT(MEMBER_ID) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID) AS R
JOIN MEMBER_PROFILE M ON R.MEMBER_ID = M.MEMBER_ID) B
ON A.MEMBER_ID = B.MEMBER_ID
WHERE B.RANKING = 1
ORDER BY A.REVIEW_DATE