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

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

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

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

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

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

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

  • Майк Хиллиер: Управление иерархическими данными в MySQL

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

  • Билл Карвин: Модели для иерархических данных с SQL и PHP

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

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

 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 

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

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