[SQL] 게시판 페이징을 위한 리스트 정렬 쿼리
2017. 4. 6. 17:10ㆍDatabase
게시판 페이징 처리를 위한 리스트 정렬 쿼리문을 작성해보자
우선 게시판 테이블과 시퀀스를 생성한 후 임의의 데이터를 삽입한다.
--게시판(Bulletin Board System) 테이블 생성 CREATE TABLE BBS( ARTICLE_NUMBER NUMBER PRIMARY KEY, ID VARCHAR2(15) NOT NULL, TITLE VARCHAR2(15) NOT NULL, CONTENT CLOB NOT NULL, GROUP_ID NUMBER NOT NULL, DEPTH NUMBER NOT NULL, POS NUMBER NOT NULL, --position, 게시글 순서를 조정 HIT NUMBER NOT NULL, --조회수 WRITE_DATE DATE NOT NULL, FILE_NAME VARCHAR2(300) ); --시퀀스 생성 CREATE SEQUENCE BBS_SEQ START WITH 1 INCREMENT BY 1; --임의의 데이터 삽입, 20회 정도 반복한다. INSERT INTO BBS VALUES (bbs_seq.nextval , 'kim' , bbs_seq.currval || '번 글' , bbs_seq.currval || '번 글 내용입니다.' , bbs_seq.currval --group_id , 0 --depth , 0 --pos , 0 --hit , sysdate , null); COMMIT;
아래 쿼리문들은 페이징을 위한 리스트 정렬 쿼리가 어떻게 만들어졌는지에 대한 과정이다. 마지막 쿼리문에 조회할 페이지 시작번호, 끝번호를 조건으로 하여 해당되는 게시글들을 조회할 수 있다.
SELECT rownum, bbs.* FROM bbs WHERE rownum BETWEEN 10 AND 20; --BETWEEN A AND B에서 A의 값이 1이 아니라면 rownum은 순서를 찾을 수 없다. --아무런 결과가 출력되지 않을 것이다. --쿼리를 실행하면 WHERE절부터 수행하기 때문에 SELECT 하기 전까지 rownum을 찾을 수 없기 때문이다. SELECT bbs.* FROM ( SELECT rownum AS row_num, bbs.* --rownum은 익명으로 사용해야한다 FROM bbs --결과는 출력되지만, --게시글의 순서를 최신순(group_id DESC), 본글과 답글순(pos ASC)으로 정렬이 필요하다. ) bbs WHERE row_num BETWEEN 10 AND 20; SELECT bbs.* FROM ( SELECT rownum AS row_num, bbs.* --rownum은 익명으로 사용해야한다. FROM bbs ORDER BY group_id DESC, pos ASC --게시글 순서 정렬 ) bbs WHERE row_num BETWEEN 10 AND 20; --원하는 데이터를 가져오지 못한다. --ORDER BY가 rownum값을 만드는 데 영향을 주지 않는 듯 하다. SELECT rownum, bbs.* FROM ( SELECT bbs.* FROM bbs ORDER BY group_id DESC, pos ASC ) bbs WHERE rownum BETWEEN 10 AND 20; --처음과 같이 rownum을 찾을 수 없다. --만약 rownum이 무조건 1부터 시작한다면 더이상의 과정은 필요없다. --'답글 보기' 기능에는 이 방식을 사용할 것이다. --위와 같은 과정을 통해서 이러한 쿼리문이 만들어졌다. SELECT bbs.* FROM ( SELECT rownum AS row_num, bbs.* FROM ( SELECT bbs.* FROM bbs ORDER BY group_id DESC, pos ASC ) bbs ) bbs WHERE row_num BETWEEN 10 AND 20;
[rownum을 이용한 게시판 페이징 참고]
'Database' 카테고리의 다른 글
[PostgreSQL] PL/Python (0) | 2024.12.06 |
---|---|
[SQL] 테이블 수동 백업 (0) | 2017.03.30 |
[Oracle] 테이블스페이스, 사용자, 테이블 생성하기 (0) | 2017.02.24 |