트리를 RDBMS에 넣으려고 하면 id와 parent_id를 만들어서 나타낼 수 있다. 대충 만들어보면 다음과 같은 테이블이 나온다.
CREATE TABLE tree_message (
id INT PRIMARY KEY AUTO_INCREMENT,
parent_id INT REFERENCES tree_message(id),
message TEXT
)
내가 원하는 건 어떤 행의 모든 부모 행을 가져오는것이다. 단순히 생각하면 걍 여러번 쿼리를 때리면 되는데 이걸 한번에 할 수는 없을까? 하고 ChatGPT에게 물어보니 바로 가르쳐줌 쉬발;
WITH RECURSIVE ancestors AS (
SELECT id, parent_id, message
FROM tree_message
WHERE id = <taret_id>
UNION ALL
SELECT t.id, t.parent_id, t.message
FROM tree_message AS t
JOIN ancestors AS a ON t.id = a.parent_id
) SELECT * FROM ancestors
로 하면 된다. 그다지 깊지 않은 경우엔 재귀쿼리가 낫고 매우 깊어질 가능성이 있는 경우엔 기존처럼 여러번 쿼리 때리는게 나을 듯
Postgresql 17과 MariaDB 10.11 에서 테스트 해봤는데 잘 된다.
끗.
답글 남기기