437 Stimmen

Wie erstellt man eine MySQL-hierarchische rekursive Abfrage?

Ich habe eine MySQL-Tabelle, die wie folgt aussieht:

id

name

parent_id

19

Kategorie1

0

20

Kategorie2

19

21

Kategorie3

20

22

Kategorie4

21

...

...

...

Jetzt möchte ich eine einzige MySQL-Abfrage haben, der ich einfach die ID [zum Beispiel id=19] übergebe und dann alle Kind-IDs bekomme [also das Ergebnis sollten IDs '20,21,22' sein]....

Die Hierarchie der Kinder ist nicht bekannt; sie kann variieren....

Ich weiß, wie man es mit einer for-Schleife macht... aber wie kann man das gleiche mit einer einzigen MySQL-Abfrage erreichen?

3voto

Pradip Rupareliya Punkte 545

Bildbeschreibung hier eingeben

Es handelt sich um eine Kategorie Tabelle.

SELECT  id,
        NAME,
        parent_category 
FROM    (SELECT * FROM category
         ORDER BY parent_category, id) products_sorted,
        (SELECT @pv := '2') initialisation
WHERE   FIND_IN_SET(parent_category, @pv) > 0
AND     @pv := CONCAT(@pv, ',', id)

Ausgabe:: Bildbeschreibung hier eingeben

2voto

senK Punkte 2752

Es ist ein bisschen knifflig, überprüfen Sie, ob es für Sie funktioniert

select a.id,if(a.parent = 0,@varw:=concat(a.id,','),@varw:=concat(a.id,',',@varw)) as list from (select * from recursivejoin order by if(parent=0,id,parent) asc) a left join recursivejoin b on (a.id = b.parent),(select @varw:='') as c  having list like '%19,%';

SQL Fiddle Link http://www.sqlfiddle.com/#!2/e3cdf/2

Ersetzen Sie die entsprechenden Feld- und Tabellennamen.

0voto

Monzur Punkte 1204

Dies funktioniert für mich, hoffe, dass es auch für Sie funktioniert. Es wird Ihnen einen Datensatz Root to Child für ein spezifisches Menü geben. Ändern Sie den Feldnamen entsprechend Ihren Anforderungen.

SET @id:= '22';

SELECT Menu_Name, (@id:=Sub_Menu_ID ) as Sub_Menu_ID, Menu_ID 
FROM 
    ( SELECT Menu_ID, Menu_Name, Sub_Menu_ID 
      FROM menu 
      ORDER BY Sub_Menu_ID DESC
    ) AS aux_table 
    WHERE Menu_ID = @id
     ORDER BY Sub_Menu_ID;

-1voto

cripox Punkte 557

Ich habe es einfacher gefunden zu :

1) eine Funktion zu erstellen, die überprüft, ob ein Element irgendwo in der Elternhierarchie eines anderen vorhanden ist. Etwas Ähnliches wie dies (Ich werde die Funktion nicht schreiben, mach es mit WHILE DO) :

is_related(id, parent_id);

in deinem Beispiel

is_related(21, 19) == 1;
is_related(20, 19) == 1;
is_related(21, 18) == 0;

2) einen Unterselect zu verwenden, etwas Ähnliches wie dies:

select ...
from table t
join table pt on pt.id in (select i.id from table i where is_related(t.id,i.id));

-2voto

Manish Punkte 3145

Ich habe eine Abfrage für dich gemacht. Dies gibt Ihnen die rekursive Kategorie mit einer einzigen Abfrage:

SELECT id,NAME,'' AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 WHERE prent is NULL
UNION 
SELECT b.id,a.name,b.name AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id WHERE a.prent is NULL AND b.name IS NOT NULL 
UNION 
SELECT c.id,a.name,b.name AS subName,c.name AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id WHERE a.prent is NULL AND c.name IS NOT NULL 
UNION 
SELECT d.id,a.name,b.name AS subName,c.name AS subsubName,d.name AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id LEFT JOIN Table1 AS d ON d.prent=c.id WHERE a.prent is NULL AND d.name IS NOT NULL 
ORDER BY NAME,subName,subsubName,subsubsubName

Hier ist ein Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X