본문 바로가기
DB

[mysql] 계층형 쿼리, 대댓글 계층구조 조회

by 오늘의개발부 2019. 7. 24.
반응형

mysql 계층형 쿼리, 대댓글 계층 구조 조회


이런 형태의 댓글 구조를 select 해오려고 한다. 숫자는 댓글이며 등록된 순서를 나타낸다. 모든 댓글은 부모의 id를 알고 있고 depth가 0인 최상위 댓글이 가진 부모 id 는 0이다.
depth가 1까지만 들어가는 단순 부모자식 관계라면 order by 만 해줘도 제대로 조회해올 수 있다. 하지만 depth가 2 이상으로 들어가게 되면 계층형 쿼리 조회가 필요하다.

WITH RECURSIVE CTE AS (
    SELECT
        parent_srl,
        commnet_srl
    FROM comments
    WHERE parent_srl = 0
    UNION ALL
    SELECT
        a.parent_srl,
        a.comment_srl
    FROM comments a
    INNER JOIN CTE b ON a.parent_srl = b.comment_srl
    );

부모의 id가 0인 최상위 계층을 기준으로 하위 노드들을 찾아온다.
하지만 'WITH RECURSIVE' 는 mysql 5.7 이하 미지원이라고 한다.. 그래서 사실 제대로 된 쿼리문인지 돌려보지도 못했다.

다른 방법을 찾았다.

SELECT @var AS comment_id
, ( SELECT @var := parent_srl FROM comments WHERE comment_srl = comment_id) AS parent_id
, @var2 := @var2 +1 AS LEVEL
FROM (SELECT @var := 128021) VARS
, comments H
, (SELECT @var2 := 0) LV
WHERE @var <> 0;


이렇게 하면 128021 댓글의 부모노드를 읽어온다. 하지만 자식으로부터 부모를 역순으로 찾아가기 때문에 노드 전체 구조는 조회가 안 되는 것 같다. 댓글 계층 전체를 가져오려면 mysql에 사용자 함수를 등록하는 방법이 있는 듯. 조금 더 찾아봐야 할 것 같다.

더불어 oracle에는 connect by 라는 기능이 있어 계층 구조를 손쉽게 읽어올 수 있다고 한다..
mysql에서 계층 구조 읽어오는 쿼리는 더 찾아보고 추가 예정...!

반응형