mysql 공지게시판 정렬 0 4 1,884

by 밍밍밍밍 [2022.11.07 19:31:48]


안녕하세요.

mariadb 5.5버전 사용중입니다.

게시판 데이터입니다.

CID TITLE CONTENTS NOTICEYN NOTICEDATE
1 제목1 내용1 Y 20221109
2 제목2 내용2 N  
3 제목3 내용3 Y 20221109
4 제목4 내용4 N  

 

 

위 데이터를 가지고 메인 게시판 정렬부분을 수정하려고 합니다.

1. 공지가 여러개인경우 공지최신글 1건만 최상단에 표시, 1건제외 나머지 CID 로 내림차순 정렬

2. 공지가 없을경우 CID로 내림차순 정렬

3. NOTICEYN이 'Y'라도 NOTICEDATE 날짜가 지나면 공지X

 

아래 결과값처럼 정렬하고 싶은데 쿼리만으로 가능할까요?

CID TITLE CONTENTS NOTICEYN NOTICEDATE
3 제목3 내용3 Y 20221109
4 제목4 내용4 N  
2 제목2 내용2 N  
1 제목1 내용1 Y 20221109

 

by 마농 [2022.11.08 09:20:34]

WITH 문은 테스트 용도입니다. 없다고 생각하고 이하 쿼리 형태만 봐주세요.
마지막 LIMIT 구문 2개는 페이징 쿼리를 염두해 두고 추가했습니다.
 

WITH bbs AS
(
SELECT 1 cid, '제목1' title, '내용1' contents, 'Y' noticeyn, '20221109' noticedate
UNION ALL SELECT 2, '제목2', '내용2', 'N', null
UNION ALL SELECT 3, '제목3', '내용3', 'Y', '20221109'
UNION ALL SELECT 4, '제목4', '내용4', 'N', null
)
(
SELECT cid, title, contents, noticeyn, noticedate
  FROM bbs
 WHERE noticeyn = 'Y'
   AND noticedate >= DATE(DATE_ADD(NOW(), INTERVAL 1 DAY))
 ORDER BY cid DESC
 LIMIT 1
)
 UNION ALL
(
SELECT cid, title, contents, noticeyn, noticedate
  FROM bbs a
 WHERE cid  != (SELECT cid
                  FROM bbs
                 WHERE noticeyn = 'Y'
                   AND noticedate >= DATE(DATE_ADD(NOW(), INTERVAL 1 DAY))
                 ORDER BY cid DESC
                 LIMIT 1
                )
 ORDER BY cid DESC
 LIMIT 0, 6
)
 LIMIT 0, 6
;

 


by 마농 [2022.11.08 10:10:07]

다시 생각해 보니 답변의 페이지 쿼리에 문제가 있네요.
탑에 올라갈 공지가 있을 수도 있고 없을 수도 있는데.
그에 따라 LIMIT 의 숫자가 영향을 받아 조정이 되야 할 수 있겠네요.
공지가 매 페이지마다 반복되어 나올지 첫페이지에 한번만 나올지도 생각해야 하고
정확한 페이징 기준이 있는지? 아니면 페이징은 아예 없는지?


by 밍밍밍밍 [2022.11.08 10:14:34]

답변 감사합니다.

답변이 없는 게시글이고 페이징도 없습니다. 6개까지 고정으로 표시가 됩니다


by 마농 [2022.11.08 10:29:49]

6개 고정이면 그대로 사용하면 될 듯 하네요.
LIMIT 0, 6 또는 LIMIT 6

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입