Notice
Recent Posts
Recent Comments
Link
- Outsider's Dev Story
- 흔한 개발자의 개발 노트
- 내 아이큐 80, 너도 80, 둘이 합쳐 160 - 내…
- 조대협의 블로그
- 자바캔(Java Can Do IT) / 최범균 님
- Sangon, Han – 개발자; 읽고 생각하고 쓰고 …
- The Evolution of the Web
- NAVER D2
- Dashboard - SLiPP
- ITWorld Korea - 테크놀로지 리더를 위한 글…
- OKKY - All That Developer
- 웹Frameworks
- 오픈튜토리얼스
- 위키독스 / 온라인 책 제작 공유 플랫폼 서비스
- 블로터
- IT OnAir
- 한 처음에 / 백창92
- Divide my knowledge / 완프최
- SERI.org
Bigfat
[SQL] 게시판 페이징을 위한 리스트 정렬 쿼리 본문
게시판 페이징 처리를 위한 리스트 정렬 쿼리문을 작성해보자
우선 게시판 테이블과 시퀀스를 생성한 후 임의의 데이터를 삽입한다.
--게시판(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 |