Самый простой способ построить дерево из списка предков
=======================================================

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

У меня есть дерево, хранящееся в SQL в качестве таблицы закрытия. Дерево выглядит так: (1 (2 (3), 4)), а языками являются MySQL SQL и PHP 5.3.

Таблица закрытия таким образом:

Я могу довольно легко опрашивать предков:

Как я могу легко построить дерево в PHP с этими данными? Могу ли я использовать более умный запрос, чтобы получить больше данных из MySQL?

 ал это на PHP, так как избегаю сложностей многозначных чисел.

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

 На данный момент меня не волнуют ключи, только списки предков. Путь через дерево можно найти между пересечением доступных узлов и оставшихся предков.



 ... я забыл, что / где я слышал, что это называется чем-то другим), но у меня был 3-й столбец "расстояния" между предком и потомком, который позволяет вам различать прямые потомки (дети) и косвенные потомки (внуки и т. д.).

 Технически таблица, которую вы перечислили, может записывать данные в ориентированном ациклическом графе, поэтому может оказаться невозможным построить иерархическое дерево без дублирующих разделов.

**редактировать**

 Если бы я делал запросы в PHP, я бы, вероятно, просто ВЫБЕРИЛ на самой таблице без использования GROUP\_CONCAT - вы все равно будете обрабатывать вещи процедурно, так почему бы просто не получить соответствующее подмножество таблицы закрытия в его самая грубая форма?

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

 Если древовидные аспекты этих иерархических данных очень важны, и у вас есть выбор, как хранить данные, рассмотрите[Nested Set Model](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) который может поддерживать порядок и намного проще восстановить дерево.