이해를 돕기 위해 수행되는 쿼리와 수행후 테이블의 row를 그려 넣었다.
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 1 |
no 는 AutoIncrement 로부터 받아온 값
grp는 no와 동일한 값
seq는 1
lvl은 0 이된다.
2) 두번째, 세번째 글이 올라올때
insert into board( title, grp, seq, lvl )
values('날씨가 맑습니다', (select last_insert_id()+1), 1, 0);
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 0 |
2 | 날씨가 맑습니다 | 2 | 1 | 0 |
3 | 모임이 있습니다 | 3 | 1 | 0 |
update board
set seq = seq + 1
where grp = 1
and seq > 1;
insert into board( title, grp, seq, lvl )
values('반가워요', 1, 1+1, 0+1);
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 0 |
2 | 날씨가 맑습니다 | 2 | 1 | 0 |
3 | 모임이 있습니다 | 3 | 1 | 0 |
4 | 반가워요 | 1 | 2 | 1 |
한 글에 대한 댓글이 여러개인 경우 우선순위를 맞춰주기 위해서
update board
set seq = seq + 1
where grp = 1
and seq > 2;
insert into board( title, grp, seq, lvl )
values('감사합니다', 1, 2+1, 1+1);
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 0 |
2 | 날씨가 맑습니다 | 2 | 1 | 0 |
3 | 모임이 있습니다 | 3 | 1 | 0 |
4 | 반가워요 | 1 | 2 | 1 |
5 | 감사합니다 | 1 | 3 | 2 |
update board
set seq = seq + 1
where grp = 1
and seq > 1;
insert into board( title, grp, seq, lvl )
values('감사합니다', 1, 1+1, 0+1);
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 0 |
2 | 날씨가 맑습니다 | 2 | 1 | 0 |
3 | 모임이 있습니다 | 3 | 1 | 0 |
4 | 반가워요 | 1 | 3 | 1 |
5 | 감사합니다 | 1 | 4 | 2 |
6 | 환영합니다 | 1 | 2 | 1 |
update board
set seq = seq + 1
where grp = 1
and seq > 2;
insert into board( title, grp, seq, lvl )
values('감사합니다', 1, 2+1, 1+1);
no | title | grp | seq | lvl |
1 | 안녕하세요 | 1 | 1 | 0 |
2 | 날씨가 맑습니다 | 2 | 1 | 0 |
3 | 모임이 있습니다 | 3 | 1 | 0 |
4 | 반가워요 | 1 | 4 | 1 |
5 | 감사합니다 | 1 | 5 | 2 |
6 | 환영합니다 | 1 | 2 | 1 |
7 | 감사합니다 | 1 | 3 | 2 |
select * from board order by grp desc, seq asc;
<DDL> 예제
drop table board;
create table board(
no int primary key,
title varchar2(45),
grp int,
seq int,
lvl int);
drop sequence board_no_seq;
create sequence board_no_seq start with 1 increment by 1;
create index board_grp_seq on board(grp desc, seq asc);
<DML> 예제
[첫번째 게시물 입력 - 새 글 입력]
insert into board
values(board_no_seq.nextval, board_no_seq.currval, 1, 0);
[두번째 게시물 입력 - 새 글 입력]
insert into board
values(board_no_seq.nextval, board_no_seq.currval, 1, 0);
[세번째 게시물 입력 - 새 글 입력]
insert into board
values(board_no_seq.nextval, board_no_seq.currval, 1, 0);
[네번째 게시물 입력 - 첫번째 게시물의 답글]
(답글이 올라오는 경우에는 답글에 부여 할 seq를 먼저 확보해준다.)
update board
set seq=seq+1
where grp=1 and seq > 1;
insert into board
values(board_no_seq.nextval, '반가워요', 1, 2, 1);
[다섯번째 게시물 입력 - 네번째 게시물의 답글]
update board
set seq=seq+1
where grp=1 and seq > 2;
insert into board
values(board_no_seq.nextval, '감사합니다', 1, 3, 2);
[여섯번째 게시물 입력 - 첫번째 게시물의 두번째 답글]
update board
set seq=seq+1
where grp=1 and seq > 1;
insert into board
values(board_no_seq.nextval, 1, 2, 1);
[일곱번째 게시물 입력 - 여섯번째 게시물의 답글]
update board
set seq=seq+1
where grp=1 and seq > 2;
insert into board
values(board_no_seq.nextval, '감사합니다', 1, 3, 2);
[게시판을 검색하는 경우, grp로 내림차순, seq로 오름차순으로 정렬하면 됩니다.]
select case when lvl=0 then no
when lvl>0 then null end no
, rpad('+', lvl, '-')||title title
from board
order by grp desc, seq;
[검색결과]
no title
----------------
3 모임이 있습니다
2 날씨가 맑습니다
1 안녕하세요
+환영합니다
+-감사합니다
+반가워요
+-감사합니다
출처 : http://hdm6337.tistory.com/entry/%EA%B3%84%EC%B8%B5%ED%98%95-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%8C%93%EA%B8%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
'프로그래밍 > MySQL' 카테고리의 다른 글
[MySQL] 날짜 차이 구하기 (0) | 2014.11.27 |
---|---|
[MySQL] DB 쿼리결과 개수 제한하기 - Limit 연산자 (0) | 2014.11.18 |
DB ConnectPool 쉬운 사용방법 java 파일 ( pool ) (0) | 2014.10.02 |
MySQL 사용자 관리 명령어 (0) | 2014.09.14 |
mysql에 cvs 파일을 넣는방법 (0) | 2014.09.11 |