Использование 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?

Ответ 2

Bill Karwin опубликовал слайд-шоу о heirarchical data в MySQL. Если изменение дизайна базы данных является опцией, есть несколько других привлекательных способов хранения ваших данных, чтобы упростить запрос. Подходы, которые он охватывает:

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

В слайде 69 есть таблица, в которой показаны плюсы и минусы каждого метода, поэтому я предлагаю вам сначала взглянуть на этот слайд, чтобы увидеть, какой из подходов может работать для вас, а затем вернуться и посмотреть на детали того, как его реализовать. Обратите внимание, что выбранный вами дизайн (список смежности) является единственным из четырех представленных проектов, что затрудняет запрос поддерева.

Сказав это, если вы не можете изменить свой дизайн или хотите придерживаться списка смежности, тогда я должен согласиться с Дидье, что вы должны взглянуть на Quassnoi article "Иерархические запросы в MySQL" . Это очень четкая статья и объясняет, как эффективно писать запрос.