Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

rekursive Abfragen in Mysql

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jetwork, 6 November 2014.

  1. jetwork

    jetwork Fleissiger Benutzer

    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 :(
     
  2. ukulele

    ukulele Datenbank-Guru

  3. jetwork

    jetwork Fleissiger Benutzer

    Danke.

    Was macht man denn in MySQL? Gibt es keine Zwischenlösung?
     
  4. ukulele

    ukulele Datenbank-Guru

    Du kannst dir ne Schleife schreiben die zu jedem möglichen Pfad einen Eintrag in eine Hilfstabelle schreibt und die kannst du dann Abfragen.
     
  5. akretschmer

    akretschmer Datenbank-Guru


    Andreas
     
    jetwork gefällt das.
  6. jetwork

    jetwork Fleissiger Benutzer

    Kann man dieses Problem nicht mit Routinen lösen? Kann ich die Rekursivität über die Routinen nicht konstruieren?
     
  7. jetwork

    jetwork Fleissiger Benutzer

    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.
     
  8. ukulele

    ukulele Datenbank-Guru

    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.
     
  9. Hony%

    Hony% Datenbank-Guru

    Eine? Das kann eigentlich jede namhafte DB außer MySQL und Forks. Sogar SQLite kann mittlerweile rekursive CTE.

    Wenn die Lösung funktioniert muss sie allerdings nach jeder Änderung der zugrunde liegenden Tabellen ausgeführt werden. ;)
     
    akretschmer gefällt das.
  10. ukulele

    ukulele Datenbank-Guru

    Oder bei Bedarf wenn die Information gebraucht wird. Oder er bastelt sich eine Lösung die nur Änderungen per Trigger erzeugt, was nervig werden könnte.
     
  11. Hony%

    Hony% Datenbank-Guru

    Kann man machen um, bei schreibintensiven Tabellen, Ressourcen zu sparen. Allerdings ist die Datenbank dann in einem nicht-konsistenten Zustand. Und zu allem Überfluss kannst du den Anwender nicht zwingen zuerst ein »Update« zu machen.
     
  12. ukulele

    ukulele Datenbank-Guru

    Wenn ich eine konsistente Datenbank haben will nehme ich aber auch nicht MySQL ;)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden