У меня есть таблица 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) и возвратить набор результатов, который содержит все древовидные записи. Кто-либо может помочь мне?
Хороший вопрос. В Oracle вы должны использовать что-то вроде CONNECT BY .
Поскольку вы используете MySQL, я бы посоветовал вам изменить структуру данных, чтобы эффективно отвечать на этот запрос. Вот несколько идей.
Посмотрите здесь в разделе «Получение единственного пути». Но лучше использовать подход вложенного набора , будет намного проще работать с деревом. Также рекомендую прочитать презентацию « Деревья в базе данных - Расширенные структуры данных ».
Было подобное обсуждение , которое могло бы помочь в решении этой проблемы.
Думаю, я мог бы решить эту проблему, рекурсивно извлекая данные, пока не достигну корневого узла (родительский узел был нулевым). Возможно, я изначально был склонен сделать это вне хранимой процедуры (многократно вызывая объект до тех пор, пока у извлеченной строки не появится родительский элемент null), но решение «закрывающая таблица» на странице, на которую я здесь ссылался, выглядит как отличное решение.
Также необходимо подумать о материализованных путях. Довольно простая концепция, не зависящая от базы данных. Намного проще управлять вставками и т.д., так как в отличие от вложенных множеств, вам не нужно знать левые/правые узлы и т.д. перед вставкой.