Rumah > pangkalan data > tutorial mysql > Bagaimanakah Prosedur Tersimpan MySQL Boleh Menyelesaikan Traversal Pokok Rekursif dalam Jadual Bil Bahan?

Bagaimanakah Prosedur Tersimpan MySQL Boleh Menyelesaikan Traversal Pokok Rekursif dalam Jadual Bil Bahan?

DDD
Lepaskan: 2024-12-04 16:26:14
asal
325 orang telah melayarinya

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

Menggunakan Pertanyaan MySQL untuk Melintasi Baris dan Mencipta Pokok Rekursif

Pernyataan Masalah

Dalam jadual Bil Bahan (BOM) dengan item dan lajur induk, anda perlu mendapatkan semula struktur pokok rekursif memaparkan hubungan ibu bapa-anak. Output yang diingini boleh melibatkan berbilang peringkat hierarki, tetapi pada masa ini, anda terhad untuk mengambil sama ada satu tahap atau mendapatkan semula semua rekod dan mengisihnya secara manual menggunakan fungsi rekursif, yang boleh menjadi tidak cekap.

Penyelesaian

Walaupun MySQL sendiri tidak menyokong traversal pokok rekursif secara asli, anda boleh menggunakan tersimpan prosedur untuk mencapai kefungsian. Satu pendekatan melibatkan mencipta tiga prosedur tersimpan:

  1. GetParentIDByID: Mendapat semula ID induk ID item yang diberikan.
  2. GetAncestry: Mengembalikan semua nenek moyang (ibu bapa dan datuk nenek) sesuatu item ID.
  3. GetFamilyTree: Menggabungkan kefungsian GetParentIDByID dan GetAncestry untuk menjana salasilah keluarga yang lengkap untuk ID item yang diberikan.

Dengan memanggil prosedur tersimpan ini dengan ID item permulaan, anda boleh melintasi baris secara rekursif dalam jadual BOM dan membina pokok yang dikehendaki struktur.

Contoh Prosedur Tersimpan:

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
Salin selepas log masuk

Penggunaan:

Untuk mendapatkan semula salasilah keluarga bermula dari ID item 1, panggil prosedur tersimpan:

CALL GetFamilyTree(1);
Salin selepas log masuk

Hasilnya akan menjadi rentetan dipisahkan koma yang mengandungi keturunan item 1.

Atas ialah kandungan terperinci Bagaimanakah Prosedur Tersimpan MySQL Boleh Menyelesaikan Traversal Pokok Rekursif dalam Jadual Bil Bahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan