У меня есть иерархическая таблица в MySQL:parent
Поле каждого элемента указывает на поле id
его родительского элемента. Для каждого элемента я могу получить список всех его родителей [независимо от глубины] с помощью запроса , описанного здесь . С GROUP_CONCAT
я получаю полный путь в виде одной строки:
SELECT GROUP_CONCAT(_id SEPARATOR ' > ') FROM (
SELECT @r AS _id,
(
SELECT @r := parent
FROM t_hierarchy
WHERE id = _id
) AS parent,
@l := @l + 1 AS lvl
FROM (
SELECT @r := 200,
@l := 0
) vars,
t_hierarchy h
WHERE @r <> 0
ORDER BY lvl DESC
) x
Я могу заставить это работать, только если id
элемента фиксировано [в данном случае это 200
].
Я хочу сделать то же самое для всех строк :получить всю таблицу с одним дополнительным полем(path
)который будет отображать полный путь. Единственное решение, которое приходит мне в голову, это обернуть этот запрос в другой выбор, установить временную переменную @id
и использовать ее внутри подзапроса. Но это не работает. Я получаю NULL
s в поле path
.
SELECT @id := id, parent, (
SELECT GROUP_CONCAT(_id SEPARATOR ' > ') FROM (
SELECT @r AS _id,
(
SELECT @r := parent
FROM t_hierarchy
WHERE id = _id
) AS parent,
@l := @l + 1 AS lvl
FROM (
SELECT @r := @id,
@l := 0
) vars,
t_hierarchy h
WHERE @r <> 0
ORDER BY lvl DESC
) x
) as path
FROM t_hierarchy
P.S. Я знаю, что могу хранить пути в отдельном поле и обновлять их при вставке/обновлении, но мне нужно решение, основанное на методе связанного списка .
ОБНОВЛЕНИЕ:Я хотел бы увидеть решение, которое не будет использовать рекурсию или конструкции вроде for
и while
. Приведенный выше метод поиска путей не использует никаких циклов или функций. Я хочу найти решение в той же логике. Или, если это невозможно, попробуйте объяснить, почему!