ホームページ >データベース >mysql チュートリアル >MySQL ストアド プロシージャは、部品表テーブルでの再帰的なツリー トラバーサルをどのように解決できますか?

MySQL ストアド プロシージャは、部品表テーブルでの再帰的なツリー トラバーサルをどのように解決できますか?

DDD
DDDオリジナル
2024-12-04 16:26:14326ブラウズ

How Can MySQL Stored Procedures Solve Recursive Tree Traversal in a Bill of Materials Table?

MySQL クエリを使用して行を走査し、再帰ツリーを作成する

問題ステートメント

品目列と親列を含む部品表 (BOM) テーブルの場合は、親子関係を表示する再帰的なツリー構造。目的の出力には複数レベルの階層が含まれる可能性がありますが、現時点では、単一レベルをフェッチするか、すべてのレコードを取得して再帰関数を使用して手動で並べ替えることに制限されており、非効率となる可能性があります。

解決策

MySQL 自体は再帰ツリー トラバーサルをネイティブにサポートしていませんが、ストアド プロシージャを利用してこの機能を実現できます。 1 つの方法では、次の 3 つのストアド プロシージャを作成します。

  1. GetParentIDByID: 指定されたアイテム ID の親 ID を取得します。
  2. GetAncestry: 戻り値特定のアイテムのすべての祖先 (両親および祖父母) ID.
  3. GetFamilyTree: GetParentIDByID と GetAncestry の機能を組み合わせて、指定された項目 ID の完全な家系図を生成します。

これらのストアド プロシージャを次のように呼び出します。開始アイテム 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。