여기서는 다루지 않지만

부모를 지우면 모든 자식을 지우는 것도 방법이 될 수 있다.

익혀두면 도움이 되는 기법이라 적어본다.

부모를 지우면 모든 자식을 지우는 방법은

부모 필드(reparent)를 따라서 나를 부모로 하는 모든 자식을 찾으면 된다.

오라클에서는 connect BY로 쉽게 구현 할 수 있는데

mysql에서는 제공되지 않는 기능으로

대부분 만들어 사용하고 있다.


다음 블로그에서 제공하는 함수를 가져와 게시판 예제에 맞추어 수정했다.

이 함수의 원리는 간단하다.

지정된 댓글을 부모로 하는 자식이 없을 때까지 반복해서 찾는(SELECT) 것이다.

블로그 내용을 잘 읽어보길 바란다.

http://blog.naver.com/PostView.nhn?blogId=endstar7&logNo=100124603859&categoryNo=32&viewDate=&currentPage=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

+ Recent posts