여기서는 다루지 않지만
부모를 지우면 모든 자식을 지우는 것도 방법이 될 수 있다.
익혀두면 도움이 되는 기법이라 적어본다.
부모를 지우면 모든 자식을 지우는 방법은
부모 필드(reparent)를 따라서 나를 부모로 하는 모든 자식을 찾으면 된다.
오라클에서는 connect BY로 쉽게 구현 할 수 있는데
mysql에서는 제공되지 않는 기능으로
대부분 만들어 사용하고 있다.
다음 블로그에서 제공하는 함수를 가져와 게시판 예제에 맞추어 수정했다.
이 함수의 원리는 간단하다.
지정된 댓글을 부모로 하는 자식이 없을 때까지 반복해서 찾는(SELECT) 것이다.
블로그 내용을 잘 읽어보길 바란다.
http://blog.naver.com/PostView.nhn?blogId=endstar7&logNo=100124603859&categoryNo=32&viewDate=¤tPage=1&listtype=0
https://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/
위 블로그의 내용과 다른 점은 테이블명(tbl_boardreply)과
게시물 번호(brdno) 값을 받아서 조건으로 사용한 것이다.
블로그 함수는 테이블의 전체 데이터를 대상으로 하고,
본 예제는 하나의 게시물에 대하여 처리하기 때문이다.
DELIMITER $$
CREATE FUNCTION board_connect_by_parent(_brdno int) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _id INT;
DECLARE _parent INT;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;
SET _parent = @id;
SET _id = -1;
IF @id IS NULL THEN
RETURN NULL;
END IF;
LOOP
SELECT MIN(reno)
INTO @id
FROM tbl_boardreply
WHERE reparent = _parent and brdno=_brdno and reno != reparent
AND reno > _id;
IF @id IS NOT NULL OR _parent = @start_with THEN
SET @level = @level + 1;
RETURN @id;
END IF;
SET @level := @level - 1;
SELECT reno, reparent
INTO _id, _parent
FROM tbl_boardreply
WHERE reno = _parent and brdno=_brdno and reno != reparent;
END LOOP;
END
$$
DELIMITER ;
이렇게 작성된 함수를 다음과 같이 실행하면 된다.
다음 예는 모든 자식 리스트를 출력하는 것이고 SELECT 문 대신에 DELETE(UPDATE)문을 사용하면 된다.
SELECT *
FROM TBL_BOARDREPLY
WHERE RENO IN (
SELECT ID
FROM (
SELECT BOARD_CONNECT_BY_PARENT(18) AS ID, @LEVEL AS LEVEL
FROM (
SELECT @START_WITH := 6,
@ID := @START_WITH,
@LEVEL := 0
) VARS, TBL_BOARDREPLY
WHERE @ID IS NOT NULL
) DS
)
지정된 부모의 모든 자식을 찾거나
지정된 자식의 모든 부모를 찾는 것은 많이 사용되는 기술이니
게시판 예제에는 적용하지 않았지만 잘 익혀두길 바란다.
'Java > 게시판 6: 무한댓글' 카테고리의 다른 글
1. 무한 댓글 시작하기 (14) | 2016.05.15 |
---|---|
2. 무한 댓글 리스트 (11) | 2016.05.15 |
3. 무한 댓글 쓰기 – control (3) | 2016.05.15 |
4. 무한 댓글 쓰기 – JSP (0) | 2016.05.15 |
5. 무한 댓글 삭제 (1) | 2016.05.15 |