프로그래머스 SQL 고득점 Kit "조건에 부합하는 중고거래 댓글 조회하기" 문제 풀이입니다. USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블을 JOIN해서 특정 연월에 작성된 게시글의 댓글을 조회하고, 다중 정렬 기준(ORDER BY)까지 적용하는 방법을 정리했습니다.
포스트 본문
문제 설명
중고거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 댓글 정보를 담은 USED_GOODS_REPLY 테이블에서, 2022년 10월에 작성된 게시글에 달린 댓글 내역을 조회하는 문제입니다.
출력해야 하는 항목은 게시글 제목(TITLE), 게시글 ID(BOARD_ID), 댓글 ID(REPLY_ID), 댓글 작성자 ID(WRITER_ID), 댓글 내용(CONTENTS), 댓글 작성일(CREATED_DATE)이고, 결과는 댓글 작성일 오름차순으로 정렬하되 작성일이 같으면 게시글 제목 오름차순으로 정렬해야 합니다.
테이블 구조
USED_GOODS_BOARD: BOARD_ID(게시글 ID), WRITER_ID(작성자 ID), TITLE(제목), CONTENTS(내용), PRICE(가격), CREATED_DATE(작성일), STATUS(거래상태), VIEWS(조회수)
USED_GOODS_REPLY: REPLY_ID(댓글 ID), BOARD_ID(게시글 ID), WRITER_ID(작성자 ID), CONTENTS(댓글 내용), CREATED_DATE(작성일)
입출력 예 (결과)
| 반려견 배변패드 팝니다 | B0001 | R000000001 | s2s2123 | 구매하겠습니다. 쪽지 드립니다. | 2022-10-02 |
| 국내산 볶음참깨 | B0002 | R000000002 | hoho1112 | 쪽지 주세요. | 2022-10-03 |
주의사항: CREATED_DATE의 포맷이 예시의 포맷(YYYY-MM-DD)과 일치해야 정답 처리됩니다.
풀이 아이디어
두 테이블을 게시글 ID(BOARD_ID) 기준으로 JOIN해서 게시글 정보와 댓글 정보를 한 번에 가져와야 합니다. 이때 주의할 점이 하나 있습니다. "2022년 10월에 작성된 게시글"이 기준이므로, 조건은 댓글의 작성일이 아니라 게시글(USED_GOODS_BOARD)의 작성일에 걸어야 합니다.
절차는 다음과 같습니다.
- USED_GOODS_BOARD와 USED_GOODS_REPLY를 BOARD_ID로 JOIN합니다.
- 게시글 작성일(CREATED_DATE)이 2022년 10월인 행만 남깁니다.
- 댓글 작성일 오름차순, 동일하면 게시글 제목 오름차순으로 정렬합니다.
코드
SELECT ugb.TITLE, ugb.BOARD_ID, ugr.REPLY_ID, ugr.WRITER_ID, ugr.CONTENTS, ugr.CREATED_DATE
FROM USED_GOODS_BOARD ugb
JOIN USED_GOODS_REPLY ugr ON ugb.BOARD_ID = ugr.BOARD_ID
WHERE YEAR(ugb.CREATED_DATE) = 2022
AND MONTH(ugb.CREATED_DATE) = 10
ORDER BY ugr.CREATED_DATE, ugb.TITLE;
코드 동작 설명
- FROM USED_GOODS_BOARD ugb JOIN USED_GOODS_REPLY ugr ON ugb.BOARD_ID = ugr.BOARD_ID: 게시글 ID를 기준으로 두 테이블을 연결합니다. 댓글이 하나도 없는 게시글은 INNER JOIN이므로 자연스럽게 결과에서 제외됩니다(문제 요구사항과 일치).
- YEAR(ugb.CREATED_DATE) = 2022 AND MONTH(ugb.CREATED_DATE) = 10: 게시글 작성일에서 연도와 월을 각각 추출해 2022년 10월인 것만 필터링합니다. BETWEEN '2022-10-01' AND '2022-10-31'처럼 범위로 걸어도 동일한 결과를 얻을 수 있습니다.
- ORDER BY ugr.CREATED_DATE, ugb.TITLE: ORDER BY에 컬럼을 콤마로 나열하면 다중 정렬 기준이 됩니다. 첫 번째 기준(댓글 작성일)이 같은 행들끼리는 두 번째 기준(게시글 제목)으로 다시 정렬됩니다. 둘 다 별도 명시가 없으면 기본값인 오름차순(ASC)이 적용됩니다.
예시 데이터로 확인해보면, USED_GOODS_BOARD의 게시글 5건은 모두 2022년 10월에 작성되었지만, USED_GOODS_REPLY의 댓글 5건 중 BOARD_ID가 B0001~B0005 범위에 걸리는 것은 R000000001(B0001), R000000002(B0002) 두 건뿐입니다(R000000003~5는 B0006, B0007, B0009로 JOIN에서 매칭되지 않아 제외). 이 두 건을 댓글 작성일 순으로 정렬하면 2022-10-02(반려견 배변패드) → 2022-10-03(국내산 볶음참깨) 순이 되어, 문제에서 제시한 결과와 정확히 일치합니다.
'프로그래머스 > 레벨1' 카테고리의 다른 글
| [프로그래머스 MySQL] 연도별 대장균 크기의 편차 구하기 - SUM, MAX, MIN (0) | 2026.09.05 |
|---|---|
| [프로그래머스 MySQL] 취소되지 않은 진료 예약 조회하기 (0) | 2026.09.03 |
| [MySQL] 프로그래머스 레벨1_역순 정렬하기 (0) | 2023.02.06 |
| [MySQL] 프로그래머스 레벨1_모든 레코드 조회하기 (0) | 2023.02.06 |
| [프로그래머스/자바] 나머지가 1이 되는 숫자 찾기 (0) | 2022.02.24 |