SQL
Рекурсивный CTE для иерархий
Обход дерева категорий или комментариев любой глубины одним запросом.
Код
-- Все потомки категории вместе с уровнем вложенности и путём
WITH RECURSIVE tree AS (
-- якорь: стартовая категория
SELECT id, parent_id, name, 0 AS depth, name::text AS path
FROM categories
WHERE id = 1
UNION ALL
-- рекурсивная часть
SELECT c.id, c.parent_id, c.name, t.depth + 1, t.path || ' / ' || c.name
FROM categories c
JOIN tree t ON c.parent_id = t.id
WHERE t.depth < 10 -- защита от циклов
)
SELECT REPEAT(' ', depth) || name AS tree_view, path, depth
FROM tree
ORDER BY path;
-- Обратный обход: все предки узла
WITH RECURSIVE parents AS (
SELECT id, parent_id, name FROM categories WHERE id = 42
UNION ALL
SELECT c.id, c.parent_id, c.name
FROM categories c JOIN parents p ON c.id = p.parent_id
)
SELECT * FROM parents;