rekursive Abfragen in Mysql

jetwork

Fleissiger Benutzer
Beiträge
97
Hallo Zusammen,

Ich habe so ähnlich eine Tabelle:
+-------------+---------+--------+
| category_id | name | parent |
+-------------+-------- +--------+
| 1 | ELECTRONICS | NULL |
| 2 | TELEVISIONS | 1 |
| 3 | TUBE | 2 |
| 4 | LCD | 2 |
| 5 | PLASMA | 2 |
| 6 | PORTABLE ELECTRONICS | 1 |
| 7 | MP3 PLAYERS | 6 |
| 8 | FLASH | 7 |
| 9 | CD PLAYERS | 6 |
| 10 | 2 WAY RADIOS | 6 |
+-------------+---------+--------+

Ich mache wie folgt Abfragen:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

Ich brauche vielmehr joins. Manchmal schreibe ich leider 10 Joins nacheindander.
Kann jemand diese Abfrage für mich in rekursive Form schrieben? Ich beschäftige mich seit stunden damit.

Oder vielleicht ein Mysql-Prozedur.

Bitte Hilfe :(
 
Werbung:
Du kannst dir ne Schleife schreiben die zu jedem möglichen Pfad einen Eintrag in eine Hilfstabelle schreibt und die kannst du dann Abfragen.
 
Du kannst dir ne Schleife schreiben die zu jedem möglichen Pfad einen Eintrag in eine Hilfstabelle schreibt und die kannst du dann Abfragen.

Was für eine Hilfstabelle meinst du? Diese Tabelle kann ich konstruieren und in der Datenbank speichern. Später kann ich meine Abfragen immer über diese Hilfstabelle machen. Falls es über eine Hilfstabelle geht, möchte ich bitte deine Hilfstabelle sehen. Dann ist das Problem für mich für immer gelösst.
 
Was für eine Hilfstabelle meinst du?
Code:
CREATE TABLE baum(
    ast_id INT,
    ast VARCHAR(8000)
    );

DECLARE    @ast_id1 INT,
        @ast_id2 INT,
        @ast VARCHAR(8000)

WHILE EXISTS (    SELECT    1
                FROM    category
                LEFT JOIN baum
                ON        category_id = ast_id
                WHERE    category_id NOT IN (    SELECT    parent
                                                FROM    category ) )
BEGIN
    SET        @ast_id1 = (    SELECT    category_id
                            FROM    category
                            WHERE    category_id NOT IN (    SELECT    parent
                                                            FROM    category )
                            LIMIT 1 )
    SET        @ast_id2 = @ast_id1
    WHILE    @ast_id2 IS NOT NULL
    BEGIN
        SELECT    @ast_id2 = parent,
                @ast = name + '\' + @ast
        FROM    category
        WHERE    category_id = @ast_id2
    END
    INSERT INTO baum(ast_id,ast) VALUES(@ast_id1,@ast)
END

SELECT    *
FROM    baum

DELETE
FROM    baum
Das erzeugt dir eine Tabelle und durchläuft alle Einträge deiner category Tabelle die keinen Untereintrag mehr haben sollen und stellt für jeden einen Eintrag in die Hilfstabelle. Zumindest in der Theorie, konnte ich nicht testen.
 
umsteigen auf eine DB, die es kann (ich kenne da eine...)
Eine? Das kann eigentlich jede namhafte DB außer MySQL und Forks. Sogar SQLite kann mittlerweile rekursive CTE.

Das erzeugt dir eine Tabelle und durchläuft alle Einträge deiner category Tabelle die keinen Untereintrag mehr haben sollen und stellt für jeden einen Eintrag in die Hilfstabelle.
Wenn die Lösung funktioniert muss sie allerdings nach jeder Änderung der zugrunde liegenden Tabellen ausgeführt werden. ;)
 
Werbung:
Zurück
Oben