У меня есть набор данных, которые организованы иерархически, которые должны иметь возможность расти до произвольного размера. Мне нужно получить все дерево, но я не могу понять, как это сделать с помощью только SQL. Мое текущее решение – создать временную таблицу и использовать рекурсивную функцию для последовательно обрабатываемых ветвей дерева, а затем сохранить результат во временной таблице, которую я впоследствии запрошу снова, чтобы получить желаемый результат.
Мой вопрос в том, что я делаю, по сути, то, что соединение делает правильно? Построение промежуточной таблицы, а затем запрос результатов. Похоже, что должен быть способ сделать это с помощью объединений, но документация MySQL охватывает только извлечение частей дерева до конечной глубины. Есть ли способ сделать это? Я делаю это на PHP.
MySQL не поддерживает рекурсивные запросы.
Я бы посоветовал вам взглянуть на презентацию Билла Карвина, где он сравнивает четыре разные модели для хранения данных на основе иерархии и рассматривает их плюсы и минусы:
Слайд 48 показывает относительную сложность некоторых типов запросов с каждой из моделей. Из вашего вопроса кажется, что вас больше всего интересует «поддерево запросов», для которого список смежности (используемая вами модель) выполняет самые плохие из четырех.
Альтернативно, если вы просто хотите выбрать все дерево, как и во всех данных в таблице, вы можете использовать простой запрос SELECT * FROM yourtable
и восстановить древовидную структуру клиента.
требуется больше данных. Таблица содержит только одно дерево или несколько деревьев? Если это одно дерево, вы можете просто выбрать все из таблицы, а затем построить древовидную структуру в памяти. Если это несколько деревьев, вы можете подумать о добавлении treeID к каждому элементу дерева, чтобы представить дерево, к которому принадлежит элемент.
Если вы хотите выбрать ветвь дерева, вы можете рассмотреть возможность хранения элементов с последовательными целыми «сортировочными рангами» и ссылками на левый и правый узлы, затем выбрав все узлы в пределах целочисленного диапазона самого левого узла и самого правого узла ,
Просмотрите список смежности для получения дополнительной информации об этой модели хранилища. Вы также можете создать гибридный список смежности / родительского узла, так как хранение данных настолько дешево, но у вас может быть больше накладных расходов, поддерживающих сортировку ссылок …