[프로그래머스 SQL] 조건에 부합하는 중고거래 댓글 조회하기

kiki·2024년 1월 1일
0

프로그래머스

목록 보기
26/76

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/164673

문제 설명

  • USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회
  • 결과는 댓글 작성일을 기준으로 오름차순 정렬
  • 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬

1차 시도

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의 전체 집합)을 써주는 게 맞다.
(게시글이 없는데 댓글이 있을 순 없으니!)

2차 시도

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을 사용해 교집합, 즉 댓글이 있는 게시글만 조회하게 됨으로써 더 간결한 코드 작성이 가능하다.

정리

  • JOIN의 종류: LEFT, INNER, RIGHT 등의 다양한 JOIN이 있다는 것! 그리고 JOIN을 교집합, 합집합, 차집합등 집합의 연산으로 보면 더 쉽게 이해할 수 있다. *차집합일 때는 조건을 추가해줘야함!
  • 테이블에도 AS를!: JOIN 할 때 테이블 AS ~로 작성함으로써 코드 한 줄에서 해당 테이블을 언급(?)할 수 있는 장점이 생긴다.

0개의 댓글