Intereting Posts
array_unique vs array_flip Получение элементов DOM по имени класса Сравнение производительности производительности Apache и IIS HTTP-заголовки для jpg-файлов после mod_rewrite Настройка настраиваемого обработчика ошибок значительно увеличивает время выполнения скрипта Использование php filter_var с mysql_real_escape_string Массивы PHP – Сортировка по домену электронной почты (альтернативный) Использование MySQLI, как я могу отображать данные из своей базы данных на своем веб-сайте php make csv файл для массива Рассчитать общее количество часов от 2 временных марок Передача массива в виде аргументов, а не массива, в PHP Использование PHP & curl для публикации html-формы, содержащей файл Apigility – Как использовать модуль ORM Doctrine из командной строки ZF2 Данные POST JSON через CURL и захват PHP MYSQL – заполнять таблицы с нумерацией HTML-таблицы на основе того, соответствуют ли они номер строки

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

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

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

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

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

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

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

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

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

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

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