게시판이나 뉴스 등 에서 사용되는 댓글 기능을 구현하는 방법입니다.
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 문자열을 숫자로 변환 후 정렬을 해줘야 합니다.
'개발 - WEB, WAS, DB' 카테고리의 다른 글
디도스 공격 방어 후기 (1) (0) | 2024.08.08 |
---|---|
Mysql 윈도우에서 서버 실행 방법 및 오류 해결 (0) | 2023.01.07 |
오라클 설치 INS-30014 오류 해결 (0) | 2022.08.23 |
win-acme renewal 404 오류 해결 (0) | 2022.03.30 |
Apache - AH00547: Could not resolve host name 오류 (0) | 2022.01.02 |