隣接リストモデルを使用して、(非常に動的な)ツリー構造をMySQLデータベースに格納しています。特定のノードのすべての子孫を選択する方法が必要です。できれば、保存されたルーチンを1回呼び出すだけです。入れ子集合モデルはこれを簡単にすることは知っていますが、他のことは非常に難しくなるので、残念ながらそれは私にとって選択肢ではありません。これが私がこれまでに得たものです:
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ステートメントを発行する必要があります。ここでカーソルが役立つかもしれないことを読みましたが、その方法がわかりません。カーソルを使用する場合は、すべてを前もって選択してから繰り返す必要があるようです。