Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Melaksanakan Pengambilan Folder Rekursif dalam MySQL?

Bagaimana untuk Melaksanakan Pengambilan Folder Rekursif dalam MySQL?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 14:47:30190semak imbas

How to Implement Recursive Folder Retrieval in MySQL?

Pencapaian Rekursif Folder Kanak-kanak dalam MySQL

Apabila bekerja dengan struktur data hierarki, adalah perlu untuk mendapatkan semula elemen kanak-kanak dan sub-anak mereka daripada pangkalan data. Dalam kes jadual yang mewakili folder, pertanyaan diperlukan yang boleh mendapatkan semula semua folder anak untuk folder induk tertentu.

Pertimbangkan senario di mana kami mempunyai jadual Folder dengan struktur berikut:

CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `Folder` (`idFolder`)
);

Kami mempunyai set data sampel untuk jadual ini:

idFolder , FolderName , idFolderParent
   1           ADoc           Null  
   2           ADoc1           1  
   3           ADoc2           2
   4           ADoc3           3
   5           ADoc4           4
   6           ADoc5           5
   7           ADoc6           4

Cabaran

Memandangkan idFolder, objektifnya adalah untuk mengarang satu pertanyaan yang mendapatkan semula semua folder anak, bersama-sama dengan mana-mana folder sub-anak secara rekursif. Contohnya:

  • Apabila idFolder ialah 1, hasilnya hendaklah: 2, 3, 4, 5, 6, 7
  • Untuk idFolder 4, hasil yang dijangkakan ialah: 5, 6, 7
  • Begitu juga, untuk idFolder 3, output hendaklah: 4, 5, 6, 7

Penyelesaian

Penyelesaian yang disediakan memanfaatkan gabungan pembolehubah takrif pengguna MySQL dan subkueri untuk mencapai perolehan semula rekursif:

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
  SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder 
WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder 
JOIN
(SELECT @pv:=5) tmp
) a;

Penjelasan

Pertanyaan menggunakan fungsi FIND_IN_SET() untuk menyemak sama ada idFolderParent bagi baris semasa wujud dalam nilai pembolehubah yang ditentukan pengguna @pv. Jika ia berlaku, nilai itu dilampirkan pada pembolehubah lv. Subkueri menjana berbilang baris, setiap satu mewakili tahap carian rekursif.

Dengan menggunakan fungsi GROUP_CONCAT() dengan klausa SEPARATOR, hasil daripada setiap baris digabungkan dan dipisahkan oleh pembatas yang ditentukan (dalam kes ini , koma). Hasil akhir ialah rentetan yang mengandungi folder anak bercantum.

Penyelesaian ini menyediakan kaedah yang mantap untuk mendapatkan semula folder kanak-kanak dan sub-anak secara rekursif, walaupun apabila susunan ibu bapa dalam pangkalan data mungkin tidak mengikut hierarki yang ketat.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengambilan Folder Rekursif dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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