[TIL] 23.03.28

문종현·2023년 3월 28일
0

TIL

목록 보기
97/119
post-custom-banner

👉 오늘 한 일

  • 프로그래머스 SQL 문제풀이
  • 책 편집

프로그래머스 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
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글