>데이터 베이스 >MySQL 튜토리얼 >MySQL 저장 프로시저가 BOM 테이블의 재귀 트리 탐색을 어떻게 해결할 수 있습니까?

MySQL 저장 프로시저가 BOM 테이블의 재귀 트리 탐색을 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-12-04 16:26:14326검색

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

MySQL 쿼리를 사용하여 행 탐색 및 재귀 트리 생성

문제 설명

In 항목 및 상위 열이 있는 BOM(Bill of Materials) 테이블을 검색해야 합니다. 부모-자식 관계를 표시하는 재귀 트리 구조입니다. 원하는 출력에는 여러 수준의 계층이 포함될 수 있지만 현재는 단일 수준을 가져오거나 모든 레코드를 검색하고 재귀 함수를 사용하여 수동으로 정렬하는 것으로 제한되어 있어 비효율적일 수 있습니다.

솔루션

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 저장 프로시저가 BOM 테이블의 재귀 트리 탐색을 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.