계층형 게시판 만들기

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

참고한 사이트

https://adgw.tistory.com/entry/계층형-게시판-알고리즘-댓글-알고리즘