Как выбрать всех родителей узла в иерархической mysql таблице?

У меня есть таблица MySQL, которая представляет данные для древовидного компонента графического интерфейса пользователя, вот структура моей таблицы:

treeTable ( 
  id INT NOT NULL PRIMARY KEY, 
  parentId INT, 
  name VARCHAR(255) 
);

parentId внешний ключ самоссылки.

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

Например, предположите, что моя таблица заполнилась этими данными:

1, null, 'root'
2, 1   , 'level_1'
3, 2   , 'level_2'

Теперь я хочу получить все родительские узлы узла 3 (узлы 1 и 2) и возвратить набор результатов, который содержит все древовидные записи. Кто-либо может помочь мне?

11
задан Tomalak 7 April 2010 в 18:14
поделиться

4 ответа

Хороший вопрос. В Oracle вы должны использовать что-то вроде CONNECT BY .

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

3
ответ дан 3 December 2019 в 11:03
поделиться

Посмотрите здесь в разделе «Получение единственного пути». Но лучше использовать подход вложенного набора , будет намного проще работать с деревом. Также рекомендую прочитать презентацию « Деревья в базе данных - Расширенные структуры данных ».

1
ответ дан 3 December 2019 в 11:03
поделиться

Было подобное обсуждение , которое могло бы помочь в решении этой проблемы.

Думаю, я мог бы решить эту проблему, рекурсивно извлекая данные, пока не достигну корневого узла (родительский узел был нулевым). Возможно, я изначально был склонен сделать это вне хранимой процедуры (многократно вызывая объект до тех пор, пока у извлеченной строки не появится родительский элемент null), но решение «закрывающая таблица» на странице, на которую я здесь ссылался, выглядит как отличное решение.

1
ответ дан 3 December 2019 в 11:03
поделиться

Также необходимо подумать о материализованных путях. Довольно простая концепция, не зависящая от базы данных. Намного проще управлять вставками и т.д., так как в отличие от вложенных множеств, вам не нужно знать левые/правые узлы и т.д. перед вставкой.

1
ответ дан 3 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: