2013-08-06 21 views
5

Ich bin neu in mysql. Dies ist meine Tabelle:mysql rekursive (Baum) Eltern-Kind-Kategorie

Kategorie Tabelle:

id | name  | prent 
---------------------------- 
1 | os   | null 
2 | linux  | 1 
3 | ubuntu  | 2 
4 | xubuntu  | 3 
5 | lubuntu  | 3 
6 | zubuntu  | 3 
7 | zubuntu 2 | 6 
8 | suse  | 2 
9 | fedora  | 2 
10 | windowse | 1 
11 | windowse xp | 10 
12 | windowse 7 | 10 
13 | windowse 8 | 10 
14 | food  | null 
15 | dance  | null 

Jede Kategorie einen Elternteil hat, und ich mag sie darauf vorzubereiten, in einem Drop-Down-Menü zu zeigen.

Dies ist, was ich zu bekommen:

id | name   | depth 
---------------------------- 
1 | os   | 0 
2 | -linux  | 1 
3 | --ubuntu  | 2 
4 | ---xubuntu | 3 
5 | ---lubuntu | 3 
6 | ---zubuntu | 3 
7 | ----zubuntu 2 | 4 
8 | --suse  | 2 
9 | --fedora  | 2 
10 | -windows  | 1 
11 | --windows xp | 2 
12 | --windows 7 | 2 
13 | --windows 8 | 2 
14 | food   | 0 
15 | dance   | 0 

Hier Kategorien sind nicht in Ordnung und mein Code hat Kategorien, um für Kinder von ihren Eltern weit zur Verfügung zu stellen. Die Einrückung vor dem Namen wird basierend auf der Tiefe der Eltern jeder Kategorie bereitgestellt. Es gibt keine Begrenzung für die Anzahl der Kinder in jeder Kategorie aber die Gesamtzahl der Kategorien werden nicht überschreiten 100.

Gibt es eine Abfrage, die ein solches Ergebnis gibt? Ich ziehe es eine Abfrage, die in Form von active record in einem PHP-Framework ausgeführt werden kann.

+1

Nr. mysql unterstützt keine rekursiven Abfragen. Sie müssen eine iterative Schleife in Ihrem Code ausführen, um sich den Baum hinunter zu arbeiten. –

+0

Haben Sie hier gesucht? http://Stackoverflow.com/questions/8633497/mysql-how-to-query-parent-child?rq=1 –

+0

@ EdManet, wie wäre es mit der Anzahl der Tiefe mehr als eins und zwei? – monjevin

Antwort

9

Diese Thread führte mich. Dank @RolandoMySQLDBA

DELIMITER $$ 
DROP FUNCTION IF EXISTS `GetAncestry` $$ 
CREATE FUNCTION `GetAncestry` (GivenID INT) RETURNS VARCHAR(1024) 
DETERMINISTIC 
BEGIN 
    DECLARE rv VARCHAR(1024); 
    DECLARE cm CHAR(1); 
    DECLARE ch INT; 

    SET rv = ''; 
    SET cm = ''; 
    SET ch = GivenID; 
    WHILE ch > 0 DO 
     SELECT IFNULL(`prent`,-1) INTO ch FROM 
     (SELECT `prent` FROM Table1 WHERE id = ch) A; 
     IF ch > 0 THEN 
      SET rv = CONCAT(rv,cm,ch); 
      SET cm = ','; 
     END IF; 
    END WHILE; 
    RETURN rv; 

END $$ 
DELIMITER ; 

Eine Arbeits fiddle hier.

SELECT id,GetAncestry(id) as parents from Table1 where id = 7; 

ID PARENTS 
7 6,3,2,1 
+0

danke, darf ich wissen was 'A' hier bedeutet? '(SELECT 'prent' FROM Tabelle1 WHERE id = ch) A;' ' – monjevin

+0

A' nur ein Alias ​​Namen für diese Ergebnismenge: (SELECT' prent' FROM Tabelle1 WHERE id = ch) –

+0

ich erkennen, wie cool diese Funktion aber bitte können Sie erklären, wie Sie die Abstammung Daten, um sie zu einer hierarchischen Liste (dessen Ende und mein Gehirn feuern nicht) hinzuzufügen nutzen würden – Hightower