[프로그래머스 SQL Lv.1] 조건에 부합하는 중고거래 댓글 구하기 (MySQL)
문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/164673
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 테이블
(1) USED_GOODS_BOARD
| Column name | Type | Nullable |
| BOARD_ID | VARCHAR(5) | FALSE |
| WRITER_ID | VARCHAR(50) | FALSE |
| TITLE | VARCHAR(100) | FALSE |
| CONTENTS | VARCHAR(1000) | FALSE |
| PRICE | NUMBER | FALSE |
| CREATED_DATE | DATE | FALSE |
| STATUS | VARCHAR(10) | FALSE |
| VIEWS | NUMBER | FALSE |
(2) USED_GOODS_REPLY
| Column name | Type | Nullable |
| REPLY_ID | VARCHAR(10) | FALSE |
| BOARD_ID | VARCHAR(5) | FALSE |
| WRITER_ID | VARCHAR(50) | FALSE |
| CONTENTS | VARCHAR(1000) | TRUE |
| CREATED_DATE | DATE | FALSE |
2. 문제
USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 (1) 2022년 10월에 작성된 (2) 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 (3) 댓글 작성일을 기준으로 오름차순 정렬해주시고, (4) 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
3. 문제풀이
[ 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회 ]
조회해야 하는 컬럼이 USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에 섞여 있으므로 두 테이블을 조인해서 컬럼을 조회해야 한다.
INNER JOIN 후 각 테이블에서 조회해야 하는 컬럼명을 써준다. 이때 조인 기준은 두 테이블 모두에 존재하는 board_id로 한다.
created_date의 경우, 기본 설정 때문에 나오는 시간(00:00:00)을 없애고 날짜만 나오도록 하기 위해 DATE_FORMAT 함수를 사용해 주었다. 이때 컬럼명을 테이블명 없이 만들기 위해 alias를 설정한다. (자세한 내용은 해당 링크의 문제풀이 참고)
SELECT board.title title, board.board_id board_id, reply.reply_id reply_id, reply.writer_id writer_id, reply.contents contents, DATE_FORMAT(reply.created_date, '%Y-%m-%d') created_date
FROM used_goods_board board
INNER JOIN used_goods_reply reply
ON board.board_id = reply.board_id
[ 2022년 10월에 작성된 게시글 찾기 ]
방1) YEAR(), MONTH() 함수를 이용한다.
WHERE YEAR(board.created_date) = 2022
AND MONTH(board.created_date) = 10
방2) 날짜 자체를 비교한다.
2022년 10월에 작성된 게시글만을 뽑아내고 싶으므로 10월 1일부터 10월 31일까지로 날짜 범위를 설정해서 비교한다.
WHERE board.created_date >= '2022-10-01'
AND board.created_date <= '2022-10-31'
[ 댓글 작성일을 기준으로 오름차순 정렬, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬 ]
ORDER BY reply.created_date, board.title
4. 정답
따라서 정답은
SELECT board.title title, board.board_id board_id, reply.reply_id reply_id, reply.writer_id writer_id, reply.contents contents, DATE_FORMAT(reply.created_date, '%Y-%m-%d') created_date
FROM used_goods_board board
INNER JOIN used_goods_reply reply
ON board.board_id = reply.board_id
WHERE YEAR(board.created_date) = 2022
AND MONTH(board.created_date) = 10
ORDER BY reply.created_date, board.title
또는
SELECT board.title title, board.board_id board_id, reply.reply_id reply_id, reply.writer_id writer_id, reply.contents contents, DATE_FORMAT(reply.created_date, '%Y-%m-%d') created_date
FROM used_goods_board board
INNER JOIN used_goods_reply reply
ON board.board_id = reply.board_id
WHERE board.created_date >= '2022-10-01'
AND board.created_date <= '2022-10-31'
ORDER BY reply.created_date, board.title