https://school.programmers.co.kr/learn/courses/30/lessons/164673
SELECT TITLE,
USED_GOODS_REPLY.BOARD_ID,
REPLY_ID,
USED_GOODS_REPLY.WRITER_ID,
USED_GOODS_REPLY.CONTENTS,
DATE_FORMAT(USED_GOODS_REPLY.CREATED_DATE, '%Y-%m-%d') AS 'CREATED_DATE'
FROM USED_GOODS_BOARD LEFT JOIN USED_GOODS_REPLY ON USED_GOODS_BOARD.BOARD_ID=USED_GOODS_REPLY.BOARD_ID
WHERE DATE_FORMAT(USED_GOODS_BOARD.CREATED_DATE, '%Y-%m')='2022-10' AND NOT REPLY_ID IS NULL
ORDER BY USED_GOODS_REPLY.CREATED_DATE, TITLE;
역대급 긴 코드. 그리고 JOIN이 처음 사용된 문제!
JOIN을 배울 때 왜 LEFT가 왜 붙는 줄 모르고 그냥 익혔었는데, LEFT JOIN을 쓰면 NOT USED_GOODS_REPLY.BOARD_ID IS NULL
를 써줘야해서 복잡해진다.
즉 LEFT JOIN만을 쓰면 두 테이블을 JOIN 하고 USED_GOODS_BOARD의 전체 집합이 조회 대상이 되는 거라서 조건에 해당하지만, 댓글이 없는 게시글도 조회되기 때문에 이 경우엔 INNER JOIN(교집합, 즉 댓글이 있는 게시글만 조회), 혹은 RIGHT JOIN(USED_GOODS_REPLY의 전체 집합)을 써주는 게 맞다.
(게시글이 없는데 댓글이 있을 순 없으니!)
SELECT TITLE,
R.BOARD_ID,
REPLY_ID,
R.WRITER_ID,
R.CONTENTS,
DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS 'CREATED_DATE'
FROM USED_GOODS_BOARD AS B INNER JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID=R.BOARD_ID
WHERE DATE_FORMAT(B.CREATED_DATE, '%Y-%m')='2022-10'
ORDER BY R.CREATED_DATE, TITLE;
테이블도 AS
로 코드를 가독성 좋게 표현해줄 수 있다.
그리고 INNER JOIN을 사용해 교집합, 즉 댓글이 있는 게시글만 조회하게 됨으로써 더 간결한 코드 작성이 가능하다.
테이블 AS ~
로 작성함으로써 코드 한 줄에서 해당 테이블을 언급(?)할 수 있는 장점이 생긴다.