개발 - WEB, WAS, DB
Mysql 대댓글 WITH RECURSIVE 계층쿼리
개미v
2023. 1. 5. 08:01
반응형
게시판이나 뉴스 등 에서 사용되는 댓글 기능을 구현하는 방법입니다.
Mysql에서는 with recursive 라는 SQL을 사용합니다.
댓글 테이블 구조
# 게시판 댓글
CREATE TABLE board_comment (
num INT UNSIGNED AUTO_INCREMENT NOT NULL,
board_num INT UNSIGNED NOT NULL,
parent_num INT UNSIGNED NULL,
content VARCHAR(16000) NOT NULL,
create_date DATETIME NOT NULL,
PRIMARY KEY (num),
FOREIGN KEY (board_num) REFERENCES board (num)
);
SELECT num, board_num, parent_num, content, create_date
FROM board_comment;
계층쿼리 조회 방법
WITH RECURSIVE CTE AS (
SELECT num, board_num, parent_num, content, create_date, convert(num, char) as path
FROM board_comment
WHERE parent_num IS NULL
AND board_num = 20
UNION ALL
SELECT uc.num, uc.board_num, uc.parent_num, uc.content, uc.create_date, concat(CTE.num, '-', uc.num) AS path
FROM board_comment uc
INNER JOIN CTE ON uc.parent_num = CTE.num
WHERE uc.board_num = 20
)
SELECT num, board_num, parent_num, content, create_date, path
FROM CTE
ORDER BY CONVERT(SUBSTRING_INDEX(path, '-', 1), UNSIGNED) ASC, num ASC, CONVERT(SUBSTRING_INDEX(path, '-', 2), UNSIGNED) ASC, num ASC;
recursive를 통해서 path를 만들고, path로 정렬 시키는 원리 입니다.
SQL에서 WITH RECURSIVE, UNION ALL, path컬럼 생성, INNER JOIN 등이 생소할 수 있는데 필수로 사용되어야 합니다.
그리고 마지막 ORDER BY부분은 생성한 path 문자열을 숫자로 변환 후 정렬을 해줘야 합니다.
반응형