Я использую модель списка смежности для хранения (очень динамичной) древовидной структуры в базе данных MySQL. Мне нужен способ выбрать всех потомков данного узла, предпочтительно с помощью одного вызова хранимой процедуры. Я знаю, что модель вложенных наборов упростит это, но сделает другие вещи очень сложными, поэтому, к сожалению, для меня это не вариант. Вот что у меня есть:
DELIMITER //
CREATE PROCEDURE get_descendants(node_id INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS descendants;
CREATE TEMPORARY TABLE descendants (id INT, name VARCHAR(100), parent_id INT);
INSERT INTO descendants
SELECT *
FROM nodes
WHERE parent_id <=> node_id;
-- ...?
END//
DELIMITER ;
Идея состоит в том, чтобы продолжать детализировать и добавлять дочерние элементы в таблицу потомков, пока я не достигну листьев. Затем я могу получить доступ к временной таблице из-за пределов процедуры... Надеюсь. (Это действительно отстой, что я не могу вернуть набор результатов из сохраненной функции.)
Мне нужно как-то перебрать результаты и выдать новый оператор SELECT для каждой строки. Я читал, что здесь могут помочь курсоры, но я не понимаю, как это сделать. Кажется, что с курсорами вы должны выбрать все заранее, а затем повторить.