Heim  >  Artikel  >  Datenbank  >  Wie implementiert man den rekursiven Ordnerabruf in MySQL?

Wie implementiert man den rekursiven Ordnerabruf in MySQL?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 14:47:30190Durchsuche

How to Implement Recursive Folder Retrieval in MySQL?

Rekursiver Abruf von untergeordneten Ordnern in MySQL

Beim Arbeiten mit hierarchischen Datenstrukturen ist es notwendig, untergeordnete Elemente und deren untergeordnete Elemente abzurufen aus der Datenbank. Im Fall einer Tabelle, die Ordner darstellt, ist eine Abfrage erforderlich, die alle untergeordneten Ordner für einen bestimmten übergeordneten Ordner abrufen kann.

Stellen Sie sich das Szenario vor, in dem wir eine Ordnertabelle mit der folgenden Struktur haben:

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`)
);

Wir haben einen Beispieldatensatz für diese Tabelle:

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

Die Herausforderung

Bei einem gegebenen idFolder besteht das Ziel darin, eine einzelne Abfrage zu erstellen, die abruft alle untergeordneten Ordner sowie alle untergeordneten Ordner rekursiv. Zum Beispiel:

  • Wenn idFolder 1 ist, sollte das Ergebnis sein: 2, 3, 4, 5, 6, 7
  • Für idFolder 4 ist das erwartete Ergebnis: 5, 6, 7
  • Ähnlich sollte die Ausgabe für idFolder 3 lauten: 4, 5, 6, 7

Die Lösung

Die bereitgestellte Lösung nutzt eine Kombination aus benutzerdefinierten MySQL-Variablen und einer Unterabfrage, um einen rekursiven Abruf zu erreichen:

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;

Erklärung

Die Abfrage nutzt die Funktion FIND_IN_SET() um zu prüfen, ob der idFolderParent der aktuellen Zeile im Wert der benutzerdefinierten Variablen @pv vorhanden ist. Wenn dies der Fall ist, wird der Wert an die Variable lv angehängt. Die Unterabfrage generiert mehrere Zeilen, von denen jede eine Ebene der rekursiven Suche darstellt.

Durch die Verwendung der Funktion GROUP_CONCAT() mit der SEPARATOR-Klausel werden die Ergebnisse jeder Zeile kombiniert und durch das angegebene Trennzeichen (in diesem Fall) getrennt , ein Komma). Das Endergebnis ist eine Zeichenfolge, die die verketteten untergeordneten Ordner enthält.

Diese Lösung bietet eine robuste Methode zum rekursiven Abrufen von untergeordneten und untergeordneten Ordnern, auch wenn die Reihenfolge der übergeordneten Ordner in der Datenbank möglicherweise nicht streng hierarchisch ist.

Das obige ist der detaillierte Inhalt vonWie implementiert man den rekursiven Ordnerabruf in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn