2012-04-05 5 views
3

Ich habe ein Problem mit der Logik-Programmierung, aber ich denke, dass könnte eine andere Lösung viel einfacher sein, dies in einem SQL-Befehl zu tun, aber gehen wir auf das Problem.Wie ein Ordner, Unterordner in einer Datenbank implementieren

Ich habe eine Tabelle in MySQL (InnoDb) wie folgt aus:

CREATE TABLE IF NOT EXISTS `folder` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `folder_id` INT NOT NULL , 
    `name` VARCHAR(100) NULL , 
    `hidden` TINYINT(1) NOT NULL DEFAULT 0 , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_folder_folder1` (`folder_id` ASC) , 
    CONSTRAINT `fk_folder_folder1` 
    FOREIGN KEY (`folder_id`) 
    REFERENCES `folder` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

Es scheint wie ein ziemlich einfach, aber ich möchte die Ordner aufzulisten, in einer Weise, dass die Unterordner dieses Ordners unten angezeigt es. Wie in jedem Datei-Repository.

Zum Beispiel:
In der Tabelle:

id name folder_id 
1 root 1 
2 etc  1 
3 dev  1 
4 apache 2 
5 php  2 
6 mysql 2 
7 hda  3 
8 hda1 3 
9 lib  1 

Ich will es zeigen wie folgt aus:

root 
    etc 
     apache 
     php 
     mysql 
    dev 
     hda 
     hda1 
    lib 

Die Frage ist, haben eine Möglichkeit, dies durch SQL-Befehl zu tun oder in PHP?
Ich versuche, in PHP zu machen, und ich sehe keinen Weg ohne eine rekursive Funktion. Aber ich habe keinen Erfolg.

Lösung:
Da der MySQL akzeptiert keine der WITH-Klausel ist die rekursive Funktion in SQL aus dem Kasten heraus. Danke Leute.

SELECT c2.name 
FROM folder c1 LEFT OUTER JOIN folder c2 
ON c2.folder_id = c1.id WHERE c2.folder_id = 1 // the id of the parent folder 
AND c2.id != c2.folder_id    // Remove the parent folder 
ORDER BY c2.folder ASC 
+0

möglich Duplikat [Sortierbaum mit einem materialisierten Pfad?] (Http://stackoverflow.com/questions/2797720/sorting-tree-with-a-materialized-path) – RedFilter

Antwort

3

sind Sie in Gefahr ein SQL anti pattern genannt naiven Bäume umzusetzen. Siehe das PDF des Buches, es zeigt mehrere gute Lösungen.

+2

Dies ist nur ein Anti-Pattern mit MySQL, weil es rekursive Abfragen (noch) nicht unterstützt. In anderen DBMS ist es sehr effizient, mit einer solchen Struktur umzugehen. –

+0

Danke Mann, das war sehr hilfreich. Du hast meinen Tag gerettet. – Guilherme

+1

Ich habe die PDF gelesen, die verlinkt war, aber keine Alternative zur Verwendung eines Baumes gefunden. Wenn jemand gegen ein Anti-Muster vorgeht, müssen alternative Lösungen vorgeschlagen werden. In der Zwischenzeit werde ich entweder Oracle's connect by nutzen, einen gespeicherten Proc oder einen CTE schreiben. Und die sehr nützliche Baumstruktur. – Karl

Verwandte Themen