首頁 > 資料庫 > mysql教程 > MySQL預存程序如何解決物料清單表中的遞迴樹遍歷?

MySQL預存程序如何解決物料清單表中的遞迴樹遍歷?

DDD
發布: 2024-12-04 16:26:14
原創
325 人瀏覽過

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

使用MySQL 查詢遍歷行並建立遞歸樹

問題陳述

中包含項目和父列的物料清單(BOM) 表,您需要檢索顯示父子關係的遞歸樹結構。所需的輸出可能涉及多個層次結構級別,但目前,您只能獲取單個級別或檢索所有記錄並使用遞歸函數手動對它們進行排序,這可能效率低下。

解決方案

雖然MySQL本身不支援遞歸樹遍歷,但您可以利用預存程序來實現此功能。一種方法涉及建立三個預存程序:

  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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板