PHP/MySQL: получение одного пути в модели списка смежности

Есть ли какой-либо эффективный способ, не ограничивая глубину, получить один путь в модели списка смежности на основе идентификатора узла? Например, если бы у меня был идентификатор узла с именем «Банан», я мог бы получить следующий путь: Еда > Фрукты > Банан.

Это не большая проблема, если это невозможно, но я подумал о том, можно ли запускать соединения через цикл while или что-то в этом роде? Пока родителю не станет 0.


person Ivar    schedule 02.09.2010    source источник


Ответы (3)


Нет, по крайней мере, не в MySQL. Это одно из самых больших ограничений Модели списка смежности.

Вы можете продолжать самостоятельно присоединяться конечное количество раз, но это уродливо, неудобно и не распространяется на неограниченный отдел. Вы также можете скачать все данные в своем приложении, построить дерево и найти путь в приложении.

Некоторые СУБД, такие как SQL Server 2005, Postgres 8.4 и Oracle 11g, поддерживают рекурсивные запросы с использованием общих табличных выражений с ключевым словом WITH. Эта функция позволяет легко писать подобные запросы, но, к сожалению, MySQL еще не поддерживает рекурсивные запросы.

Возможно, вам будет интересно ознакомиться со следующей статьей, в которой описывается альтернативная модель (модель вложенного набора), что упрощает (возможно) выполнение рекурсивных операций в MySQL:

Кроме того, я также предлагаю ознакомиться со следующей презентацией @Bill Karwin, постоянным участником Stack Overflow:

Модель замыкающей таблицы, описанная в презентации, является очень хорошей альтернативой вложенному множеству. Более подробно он описывает эту модель в своей книге SQL Antipatterns (выдержка из главы по этой теме).

person Daniel Vassallo    schedule 02.09.2010
comment
SQL Antipatterns является обязательным для разработчиков. - person Frank Heikens; 02.09.2010
comment
Хорошо, тогда я знаю ответ на этот вопрос. Раньше я довольно много работал с моделью Nested Set, но эта модель не оптимальна для сайта, над которым я работаю сегодня. Кстати, когда вы упомянули дерево, я вспомнил, что раньше строил дерево с одним запросом и некоторыми циклами PHP. Но я не могу найти свою работу - вы случайно не знаете решения этой проблемы, не так ли? - person Ivar; 02.09.2010
comment
@Ivarska: К сожалению, я не могу с этим помочь :) ... Рассматривали ли вы модель замыкающей таблицы?... Ее проще реализовать, чем вложенные наборы (но использует больше данных и требует отдельной таблицы). - person Daniel Vassallo; 02.09.2010
comment
Ничего, думаю разберусь. ;) Боюсь, я не могу найти много информации об этой модели Closure Table. Ничего страшного, но меня, безусловно, интересуют разные модели баз данных. - person Ivar; 02.09.2010

Нет, в MySQL нет рекурсивных запросов, таких как PostgreSQL, Oracle или SQL Server. Модель списка смежности не является отличной моделью при использовании MySQL, вложенный набор является лучшей (но более сложной) моделью.

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

person Frank Heikens    schedule 02.09.2010

Попробуйте этот запрос:

SET @id:=12345;

SELECT content_name, content_id, (@id:=content_parent) as content_parent 
FROM 
    ( SELECT content_id, content_name, content_id, content_parent 
      FROM content_table 
      ORDER BY content_parent DESC
    ) AS aux_table 
    WHERE content_id = @id
person CSI    schedule 24.03.2013