
1. 문제설명
다음은 중고거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고거래 게시판 첨부파일 정보를 담은 USED_GOODS_REPLY 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS은 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

USED_GOODS_REPLY 테이블은 다음과 같으며 REPLY_ID, BOARD_ID, WRITER_ID, CONTENTS, CREATED_DATE는 각각 댓글 ID, 게시글 ID, 작성자 ID, 댓글 내용, 작성일을 의미합니다.



2. 문제풀이
첫번째 시도 🙅🏻♀️ - 틀림
출력은 정상적으로 되나, 왜 실패하는 지 모르겠음..
SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS,
DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD A JOIN USED_GOODS_REPLY B
ON A.WRITER_ID = B.WRITER_ID
WHERE A.CREATED_DATE LIKE '2022-10-%'
ORDER BY B.CREATED_DATE, A.TITLE;
출력 결과 화면을 보면 2022년 11월부터 12월 데이터도 같이 출력이 되는 것으로 봐서 WHERE 절 조건에 이상이 있는 것으로 보임. 일단 CREATED_DATE는 DATE 타입이 필드에 시간 부분이 포함 되어 있기 때문에 문자열 비교하는 LIKE로 조회할 수 없는 것으로 추정됨.

위에서 WHERE 조건절을 BETRWEEN절로 바꿔줬는데도 같은 현상이 일어남.
WHERE A.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
두번째 시도 🙅🏻♀️ - 틀림
✅댓글 작성일도 2022년 10월로 해 줘야 되나?
그래서 WHERE 절에 게시글 작성일 및 댓글 작성일도 2022년 10월도 조건을 줌.
실행 결과에서도 2022년 10월에 작성된 게시글과 댓글만 필터링이 제대로 된 걸 확인하였으나 틀린 코드라는 결과를 받음
SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS,
DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD A
JOIN USED_GOODS_REPLY B ON A.WRITER_ID = B.WRITER_ID
WHERE A.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'AND
B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY B.CREATED_DATE, A.TITLE;
세번째 시도 🙆♀️ - 정답🥳
✅두 테이블을 조인하는 조건이 잘못됨.
BOARD_ID로 조인해야 하는데 나는 WRITER_ID로 조인했기 때문에 원하는 결과가 나오지 않았음. WRITER_ID는 한 사람이 여러 개의 게시글을 쓰기 때문에 일대 다 관계이고 게시글 하나에 달린 댓글 관계를 조인하기 위해서는 게시글 ID로 조인해 주어야 함. 자세히 말하자면, 각 댓글은 특정 게시글에 속하므로 댓글이 참조하는 게시글을 BOARD_ID로 연결해 주는 것이다.
✅WHERE 절에서도 DATE 포매팅을 해 줘야 함.
왜냐? 기본적으로 DATE는 시간까지 포함되는 형태이기 때문에 'Y-m-d h:m:s' 형태로 테이블에 들어가 있다. 먼저, DATE에서 시간과 일자를 잘라 주고, 달까지만 나오게 포매팅 한 다음, 2022-10월에 해당하는 조건을 조회해야 한다.
SELECT
A.TITLE,
A.BOARD_ID,
B.REPLY_ID,
B.WRITER_ID,
B.CONTENTS,
DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM
USED_GOODS_BOARD A
JOIN
USED_GOODS_REPLY B
ON
A.BOARD_ID = B.BOARD_ID
WHERE
DATE_FORMAT(A.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY
B.CREATED_DATE ASC,
A.TITLE ASC;'코딩테스트 > SQL테스트' 카테고리의 다른 글
| [프로그래머스] 👩🏻💻 (MySQL) 📚조건에 맞는 도서 리스트 출력하기 (43) | 2024.11.18 |
|---|---|
| [프로그래머스] 👩🏻💻 (MySQL) 🍦인기 있는 아이스크림 / 🏭 강원도에 위치한 생산공장 목록 출력하기 / 👩🏻👧🏻👧🏻 12세 이하인 여자 환자 목록 출력하기 문제 풀이 (36) | 2024.11.17 |
| [프로그래머스] 🐶 (MySQL) 상위 n개 레코드 (2) | 2024.10.28 |
| [프로그래머스] 🐶 (MySQL) 동물의 아이디와 이름, 여러 기준으로 정렬하기 (2) | 2024.10.28 |
| [프로그래머스] (MySQL) 서울에 위치한 식당 목록 출력하기 // 기준 테이블에 따라 GROUP BY 절에 명시해야 하는 컬럼이 다른 이유 (4) | 2024.10.28 |