posts 테이블 구조
id | 아이디 |
subject | 제목 |
content | 내용 |
ori_id | 원글의 아이디값 |
grp_ord | 그룹(원글)내에서 순서 |
depth | 게시글의 깊이 |
- 원글 : 최상위 글로 depth가 0이다.
- 부모글 : 원글을 제외하고 자식을 갖는 글(depth 1이상이면서 자식을 갖는글), 첫번째 댓글(depth가 1)인 경우 부모글은 원글이 된다.
- LAST_INSERT_ID() : 마지막으로 인서트된 id값
- 최근에 작성한 글이 먼저 보이게 정렬한다.
게시글등록
- 게시글을 인서트할때 반환되는 id값을 ori_id에 대입해준다.
- grp_ord, depth는 원글이기 때문에 0을 준다.
INSERT INTO posts SET subject = '첫번째 글',
content = '',
grp_ord = 0,
depth = 0;
UPDATE posts SET ori_id = (select last_insert_id()) WHERE id = (select last_insert_id());
댓글등록
UPDATE posts SET grp_ord = grp_order+1 WHERE ori_id = '부모글 ori_id' AND grp_ord > '부모글의 grp_ord';
INSERT INTO posts SET subject = '첫번째 글의 댓글',
content = '',
ori_id = '부모글의 ori_id',
grp_ord = '부모글의 grp_ord' + 1,
depth = '무보글의 depth' + 1;
- 최근에 등록한 댓글이 상단에 위치하기 위해서 부모글의 grp_ord보다 큰 값을 찾아 1씩 증가시켜 순서를 뒤로 밀어준다.
- 업데이트 문으로 숫자가 1씩 밀렸기 때문에 인서트할 때 grp_ord + 1를 줘서 댓글 순서를 처음으로 오게한다.
리스트쿼리
SELECT * FROM posts ORDER BY ori_id DESC, grp_ord
참고한 사이트