MySQL クエリを使用して行を走査し、再帰ツリーを作成する
問題ステートメント
品目列と親列を含む部品表 (BOM) テーブルの場合は、親子関係を表示する再帰的なツリー構造。目的の出力には複数レベルの階層が含まれる可能性がありますが、現時点では、単一レベルをフェッチするか、すべてのレコードを取得して再帰関数を使用して手動で並べ替えることに制限されており、非効率となる可能性があります。
解決策
MySQL 自体は再帰ツリー トラバーサルをネイティブにサポートしていませんが、ストアド プロシージャを利用してこの機能を実現できます。 1 つの方法では、次の 3 つのストアド プロシージャを作成します。
これらのストアド プロシージャを次のように呼び出します。開始アイテム ID を使用すると、BOM テーブル内の行を再帰的に走査して、目的のツリーを構築できます。構造体。
ストアド プロシージャの例:
CREATE PROCEDURE GetFamilyTree(IN start_item_id INT) BEGIN # Declare variables DECLARE parent_id INT; DECLARE ancestry VARCHAR(255); DECLARE done TINYINT DEFAULT 0; # Loop through item IDs until done WHILE NOT done DO # Get parent ID CALL GetParentIDByID(start_item_id, parent_id); # If parent ID is null, we're done IF parent_id IS NULL THEN SET done = 1; LEAVE; END IF; # Append parent ID to ancestry SET ancestry = CONCAT(ancestry, ',', parent_id); # Set current item ID to parent ID SET start_item_id = parent_id; END WHILE; # Return ancestry as result SELECT ancestry; END
使用法:
アイテム ID から始まる家系図を取得するには1、ストアド プロシージャを呼び出します:
CALL GetFamilyTree(1);
結果は次のようになります。項目 1 の祖先を含むカンマ区切りの文字列。
以上がMySQL ストアド プロシージャは、部品表テーブルでの再帰的なツリー トラバーサルをどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。