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:
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
Penggunaan:
Untuk mendapatkan semula salasilah keluarga bermula dari ID item 1, panggil prosedur tersimpan:
CALL GetFamilyTree(1);
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!