개발 - 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 문자열을 숫자로 변환 후 정렬을 해줘야 합니다.