댓글의 댓글 기능을 어떻게 구현할지에 대해 생각해보다 self join의 개념을 알게 되었다.
일반적으로 JOIN 은 연관된 테이블간의 정보를 연결하여 조회할 때 사용한다. 그러나 같은 테이블을 참조하는 SELF JOIN도 가능하다고 한다.
SELECT
c1.id AS original_id,
c1.content AS original_content,
c2.id AS reply_id,
c2.content AS reply_content
FROM comments c1
LEFT JOIN comments c2
ON c1.id = c2.comment_id;
댓글 하나에 댓글이 여러 개 달릴 수 있다면 group by와 json_arrayagg 를 사용하여 데이터를 묶어서 조회하는 방법도 생각할 수 있겠다.
SELECT
c1.id AS original_id,
c1.user_id AS original_user_id,
c1.content AS original_content,
JSON_ARRAYAGG (
JSON_OBJECT(
"reply_id", c2.id,
"reply_user_id", c2.user_id,
"reply_content", c2.content
)
) AS reply
FROM comments c1
JOIN comments c2 ON c1.id = c2.comment_id;
GROUP BY c1.id