컨텐츠 게시판에서 최근 n기간 이내에 등록한 특정 카테고리의 게시글을 가져오기 - SQL, INNER JOIN, WHERE 조건절, DATE_FORMAT, DATE_ADD, Order By 정렬

Renee·2023년 3월 4일
0

컨텐츠 테이블과 컨텐츠 관리 테이블을 조인하여 특정 메뉴의 최근 n기간 내의 글만 조회하기

이 포스팅은 날짜를 포맷팅하는 함수인 DATE_FORMAT()과 기간을 더하는 함수인 DATE_ADD(), JOIN의 사용에 대해 기록하기 위한 목적!

신규 프로젝트 1차 개발 업무를 마무리하고, 2차 개발에서는 알림 설정과 알림 메시지를 관리하는 게시판을 개발하게 되었다. 본격적인 업무 시작에 앞서, 사용자가 앱에 올라오는 새로운 컨텐츠에 대한 알림을 받기로 설정했을 때 최근 n기간 내에 등록된 새 글만 조회되도록 하는 쿼리를 짜보았다. 컨텐츠 내의 게시글의 삭제 여부와 게시글이 사용자 화면에 노출되는지, 노출되는 기간을 설정했을 경우까지 체크하여 가져온다. 점심 먹고 2시간동안 머리를 굴려 굴려 짠 결과는 아래에..

게시글 순번(NTEC_SN), 등록일자(REGIST_DT), 컨텐츠 아이디(CNTNTS_ID), 컨텐츠 이름(CNTNTS_NM), 게시글 제목(NTCE_SJ), 상태(STTUS), 노출 여부(PD_EXPSR_POSBL), 시작일(BGNDE), 종료일(ENDDE)

SELECT NTCE_SN, REGIST_DT, tb_layout.CNTNTS_ID, CNTNTS_NM, NTCE_SJ 
FROM tb_layout INNER JOIN tb_layout_cntnts 
ON tb_layout.CNTNTS_ID = tb_layout_cntnts.CNTNTS_ID 
WHERE REGIST_DT > DATE_ADD(NOW(), INTERVAL - 6 MONTH) 
AND tb_layout.STTUS = 1 
			AND (
				tb_layout.PD_EXPSR_POSBL = false
				OR 
				(
					tb_layout.PD_EXPSR_POSBL = true 
					AND 
					(
						(
							DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i') BETWEEN DATE_FORMAT(tb_layout.BGNDE, '%Y-%m-%d %H:%i') AND DATE_FORMAT(tb_layout.ENDDE, '%Y-%m-%d %H:%i')
							AND tb_layout.BGNDE IS NOT NULL AND tb_layout.endde IS NOT NULL
						) 
						OR 
						(
							DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i') >= DATE_FORMAT(tb_layout.BGNDE, '%Y-%m-%d %H:%i') AND tb_layout.BGNDE IS NOT NULL AND tb_layout.ENDDE IS NULL
						)
						OR 
						(
							DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i') <= DATE_FORMAT(tb_layout.endde, '%Y-%m-%d %H:%i') AND tb_layout.BGNDE IS NULL AND tb_layout.ENDDE IS NOT NULL
						)
					)
				)	
			) 
ORDER BY REGIST_DT ASC;
  • 주테이블인 TB_LAYOUT과 컨텐츠의 아이디를 관리하는 TB_LAYOUT_CNTNTS 테이블을 조인하여, M.ZIP 내에 제공되는 특정한 컨텐츠의 새로운 게시글의 간단한 정보(시퀀스와 컨텐츠명, 글 제목과 등록일)를 보여주도록 했다.
  • STTUS = 1이면, 현재 컨텐츠 내의 게시글이 보여지는 상태이고, 그 아래의 조건들은 관리자가 노출 기간을 설정한 경우, 조회하는 현재일이 그 기간 내에 있는지를 체크한다.
  • 노출 기간 내에 있는 경우(PD_EXPSR_POSBL = true), 그 아래로 이어지는 첫번째 조건은 시작일과 종료일을 모두 포함해서 기간을 표시한 경우, 2. 두번째 조건은 시작일만 체크해서 시작일은 값이 있고, 종료일은 값이 없는 경우, 3. 세번째 조건은 종료일만 체크해서 시작일은 값이 없고, 종료일은 값이 있는 경우를 체크한다.
  • 또한 WHERE REGIST_DT > DATE_ADD(NOW(), INTERVAL - 6 MONTH) 조건절을 통해 등록된지 6개월 이내의 글만 조회되도록 했다.

0개의 댓글