Использование MySQL-запроса для перемещения строк для создания рекурсивного дерева
У меня есть таблица спецификаций, которая настраивается следующим образом:
item - parent
Конечным результатом при отображении спецификации материалов является то, что оно отображается следующим образом:
item 1 - parent 0
item 2 - parent 1
item 3 - parent 1
Конечный результат может также быть многоуровневым следующим образом:
item 3 - parent 0
item 4 - parent 3
item 76 - parent 3
И он может продолжаться до бесконечности:
item 76 - parent 0
item 46 - parent 76
item 46 - parent 0
item 25 - parent 46
Прямо сейчас, я либо просто получаю 1 уровень из базы данных:
SELECT * FROM bom WHERE parentId = $itemId (shorthand)
Или вытащите каждую строку из таблицы и используйте мою рекурсивную функцию для сортировки только тех, которые мне нужны, но это явно неэффективно, так как мне может понадобиться только 10 строк, но я вытащил 10 000 записей. Результат рекурсивной функции будет просто создавать дерево, подобное этому:
item 1
item 2
item 3
item 4
item 76
item 46
item 25
Все, что я знаю, это то, что я начинаю с пункта 1. Пункт 5 может иметь родителя из 11; им не нужно идти последовательно. Я хочу получить все дочерние ветки в дереве. Как я могу выполнить этот запрос в mysql?
Ответы
Ответ 1
Еще в октябре 24, 2011, кто-то отправил вопрос в DBA StackExchange об обходе дерева в MySQL. SQL для MySQL не может его поддерживать.
Я написал три (3) хранимых процедуры (GetParentIDByID, GetAncestry и GetFamilyTree) в ответе на этот вопрос. Надеюсь, эта информация поможет вам построить то, что вы ищете.
Ответ 2
Bill Karwin опубликовал слайд-шоу о heirarchical data в MySQL. Если изменение дизайна базы данных является опцией, есть несколько других привлекательных способов хранения ваших данных, чтобы упростить запрос. Подходы, которые он охватывает:
- Список контактов
- Перечисление пути
- Вложенные наборы
- Таблица закрытия
В слайде 69 есть таблица, в которой показаны плюсы и минусы каждого метода, поэтому я предлагаю вам сначала взглянуть на этот слайд, чтобы увидеть, какой из подходов может работать для вас, а затем вернуться и посмотреть на детали того, как его реализовать. Обратите внимание, что выбранный вами дизайн (список смежности) является единственным из четырех представленных проектов, что затрудняет запрос поддерева.
Сказав это, если вы не можете изменить свой дизайн или хотите придерживаться списка смежности, тогда я должен согласиться с Дидье, что вы должны взглянуть на Quassnoi article "Иерархические запросы в MySQL" . Это очень четкая статья и объясняет, как эффективно писать запрос.
Ответ 3
AFAIK, это нетривиально для этого с MySQL.
Вот хороший набор статей об этом:
http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/