2010-09-13 2 views
2

У меня есть набор данных, которые организованы иерархически, которые должны быть способны вырасти до произвольного размера. Мне нужно получить все дерево, но я не могу понять, как это сделать с помощью только SQL. Мое текущее решение - создать временную таблицу и использовать рекурсивную функцию для последовательно обрабатываемых ветвей дерева, а затем сохранить результат во временной таблице, которую я впоследствии запрошу снова, чтобы получить желаемый результат.Рекурсивный запрос MySQL?

Мой вопрос в том, что я делаю, по сути, то, что соединение делает правильно? Построение промежуточной таблицы, а затем запрос результатов. Похоже, что должен быть способ сделать это с помощью объединений, но документация MySQL охватывает только извлечение частей дерева до конечной глубины. Есть ли способ сделать это? Я делаю это на PHP.

+0

MySQL не поддерживает иерархическую/рекурсивную поддержку запросов. –

+0

Аналогичный вопрос, который я задал, может быть полезен: http://stackoverflow.com/questions/2352543/implementing-recursive-comments-in-php-mysql – GSto

ответ

15

MySQL не поддерживает рекурсивные запросы.

Я хотел бы предложить, что вы смотрите на Билла Karwin-х presentation, где он сравнивает четыре различные модели для хранения heirarchical данных и смотрит на их плюсы и минусы:

  • список смежности
  • Путь перечисления
  • Вложенные наборы
  • Закрытие таблица

Слайд 48 показывает relativ e трудности некоторых типов запросов с каждой из моделей. Из вашего вопроса кажется, что вас больше всего интересует «поддерево запросов», для которого список смежности (используемая вами модель) выполняет самые плохие из четырех.

Альтернативно, если вы просто хотите выбрать все дерево, как и во всех данных в таблице, вы можете использовать простой запрос SELECT * FROM yourtable и восстановить структуру дерева в клиенте.

+1

Книга Karwin * SQL Antipatterns * хорошо читается об этих типах вещи. –

+0

Спасибо, это было отлично прочитано. Вложенные наборы становятся чем-то идеальным решением, хотя это немного усложняет SQL. –

+0

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

1

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

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

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

Смежные вопросы