Bigfat

[SQL] 게시판 페이징을 위한 리스트 정렬 쿼리 본문

Database

[SQL] 게시판 페이징을 위한 리스트 정렬 쿼리

kyou 2017. 4. 6. 17:10

게시판 페이징 처리를 위한 리스트 정렬 쿼리문을 작성해보자

  우선 게시판 테이블과 시퀀스를 생성한 후 임의의 데이터를 삽입한다.

--게시판(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' 카테고리의 다른 글

[SQL] 테이블 수동 백업  (0) 2017.03.30
[Oracle] 테이블스페이스, 사용자, 테이블 생성하기  (0) 2017.02.24