Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Mengambil Semua Folder Kanak-kanak dan Anak Kecil dalam Pangkalan Data Hierarki menggunakan Pertanyaan SQL Tunggal?

Bagaimana untuk Mengambil Semua Folder Kanak-kanak dan Anak Kecil dalam Pangkalan Data Hierarki menggunakan Pertanyaan SQL Tunggal?

Barbara Streisand
Barbara Streisandasal
2024-11-02 03:00:30380semak imbas

How to Retrieve All Child and Subchild Folders in a Hierarchical Database using a Single SQL Query?

Pertanyaan Rekursif untuk Dapatkan Semua Folder Kanak-kanak dan Anak Kecil dalam MySQL

Soalan:

Bagaimana bolehkah saya mereka bentuk pertanyaan SQL tunggal untuk mendapatkan semua folder kanak-kanak dan anak kecil untuk ID folder induk yang diberikan dalam pangkalan data hierarki?

Senario:

Pertimbangkan Folder jadual 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`)
);

Jadual diisi seperti berikut:

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

Masalah Pernyataan:

Kami mahu mereka bentuk pertanyaan yang mengembalikan semua folder kanak-kanak dan anak kecil untuk ID folder induk tertentu. Contohnya:

  • Untuk ID folder induk 1, pertanyaan hendaklah mengembalikan [2, 3, 4, 5, 6, 7].
  • Untuk ID folder induk 4, pertanyaan harus kembali [5, 7, 6].
  • Untuk ID folder induk 3, pertanyaan harus kembali [4, 5, 6, 7].

Penyelesaian:

Pertanyaan berikut menggunakan teknik rekursif untuk mencapai hasil yang diinginkan:

<code class="sql">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;</code>

Penjelasan:

  • Pertanyaan menggunakan pembolehubah yang ditentukan pengguna @pv untuk menyimpan senarai ID folder kanak-kanak yang dipisahkan koma untuk tahap semasa.
  • Subkueri dalam pernyataan SELECT mendapatkan semula ID folder kanak-kanak untuk tahap semasa, memisahkannya dengan koma.
  • Pertanyaan luar kemudian menggabungkan keputusan semua peringkat, menyediakan senarai yang dipisahkan koma bagi semua ID folder kanak-kanak dan anak kecil untuk yang ditentukan ibu bapa.

Atas ialah kandungan terperinci Bagaimana untuk Mengambil Semua Folder Kanak-kanak dan Anak Kecil dalam Pangkalan Data Hierarki menggunakan Pertanyaan SQL Tunggal?. 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