Рекурсивный запрос MySQL? - PullRequest
       4

Рекурсивный запрос MySQL?

2 голосов
/ 14 сентября 2010

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

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

Ответы [ 2 ]

15 голосов
/ 14 сентября 2010

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

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

  • Список смежностей
  • Перечисление пути
  • Вложенные множества
  • Таблица закрытия

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

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

1 голос
/ 14 сентября 2010

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

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

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

...