Иерархическая таблица -как получить пути элементов [связанные списки в MySQL]

У меня есть иерархическая таблица в 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и использовать ее внутри подзапроса. Но это не работает. Я получаю NULLs в поле 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. Приведенный выше метод поиска путей не использует никаких циклов или функций. Я хочу найти решение в той же логике. Или, если это невозможно, попробуйте объяснить, почему!

8
задан Hrant Khachatrian 29 August 2012 в 12:58
поделиться