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

select abfrage Kategoriebaum

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von eleven, 22 Februar 2013.

  1. eleven

    eleven Neuer Benutzer

    Hallo Community,
    ich habe folgendes Problem:
    Ich benötige einen kategoriebaum aus einer DB Abfrage, meine Tabellen sehen folgendermassen aus:
    Code:
    categories
    ----------------------
    | cat_id | parent_id |
    ----------------------
    | 1      | 0         |
    | 2      | 0         |
    | 3      | 1         |
    | 4      | 1         |
    | 5      | 2         |
    | 6      | 5         |
    ----------------------
     
    categories_description
    -------------------------------
    | cat_id |    cat_name        |
    -------------------------------
    | 1      | Kat 1              |
    | 2      | Kat 2              |
    | 3      | Unter_Kat 1a       |
    | 4      | Unter_Kat 1b       |
    | 5      | Unter_Kat 2a       |
    | 6      | Unter_unter_Kat 2a |
    -------------------------------
    Wenn ich nun folgende abfrage sende
    PHP:
    SELECT c.cat_id,
          
    cd.cat_name,
          
    c.parent_id
    FROM 
    " . TABLE_CATEGORIES . " AS c,
        
    " . TABLE_CATEGORIES_DESCRIPTION . " AS cd
    WHERE c
    .categories_id cd.categories_id
    ORDER BY 
    " . $catsort  
    erhalte ich folgende ausgabe der Kategorien

    Code:
    Kat 1
    Kat 2
    Unter_Kat 1a
    Unter_Kat 1b
    Unter_Kat 2a
    Unter_unter_Kat 2a
    die ausgabe soll aber folgendermassen aussehen:

    Code:
    Kat 1
    --Unter_Kat 1a
    --Unter_Kat 1b
    Kat 2
    --Unter_Kat 2a
    ----Unter_unter_Kat 2a
    Ist es möglich die Kategorienamen in der Reihenfolge ihrer hierarischen Struktur auszugeben, wenn ja wie ??

    Würde mich über jeden Tipp oder Hilfestellung freuen !

    Gruß eleven
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Geht, aber folgendes wird sehr wahrscheinlich NICHT mit MySQL gehen:

    Code:
    test=*# with recursive r as (select id, parent, 0 as level, row_number() over () as n from categories where parent = 0 union all select c.id, c.parent, r.level+1, r.n from categories c join r on r.id=c.parent) select r.id,r.n, parent, level, repeat('--',level)||'> '|| cat_name from r left join categories_description cd on r.id=cd.id order by r.n;
     id | n | parent | level |         ?column?
    ----+---+--------+-------+--------------------------
      1 | 1 |      0 |     0 | > Kat 1
      3 | 1 |      1 |     1 | --> Unter_Kat 1a
      4 | 1 |      1 |     1 | --> Unter_Kat 1b
      2 | 2 |      0 |     0 | > Kat 2
      5 | 2 |      2 |     1 | --> Unter_Kat 2a
      6 | 2 |      5 |     2 | ----> Unter_unter_Kat 2a
    (6 rows)
    
    Time: 0,899 ms
    
    Soweit ich weiß kann MySQL weder rekursive Abfragen noch row_number(). Ich hab meine 'Hilfsspalten' mit angezeigt, damit das viellecht etwas verständlicher wird.
    Für MySQL mußt halt mal googeln, z.B. nach nested sets oder so, um das auch so hinzubekommen.

    Andreas
     
  3. ukulele

    ukulele Datenbank-Guru

    Also unter MS SQL habe ich sowas mal gemacht, leider kann ich mangels Zeit nicht viel beitragen.

    Guck dir mal folgendes an:
    http://msdn.microsoft.com/de-de/magazine/cc794278.aspx

    Speziell dieser Code könnte Sinn machen. Du kreierst einfach sowas wie einen Pfad und ordnest dein Suchergebnis danach. Der kann auch aus einer Sicht dazu gejoint werden.
    Code:
    with c as (
      select '/'+cast(billID as varchar(49)) as path,BillID
      from dbo.bill b
      where b.parentBillID is null
        union all
      select cast(c.path+'/'+CAST(b.billID as varchar(4)) as varchar(50)),    b.billID
      from dbo.bill b join c on b.parentBillID = c.billID)
    select c.path+'/',b.descr
    from c join dbo.bill b on c.billID = b.billID
    order by 1;
    Ergebniss des Beispiels siehe Abbildung 5 im Artikel.
     
  4. eleven

    eleven Neuer Benutzer

    Erst mal danke für die Antworten!

    Bin jetzt schon mal einen Schritt weiter:
    PHP:
    SELECT  p.cat_id,
                          
    p.parent_id,
                          
    p.cat_id AS sequence
                  FROM categories 
    AS p
                  WHERE p
    .parent_id 0
                  UNION
                  SELECT  t
    .cat_id,
                          
    t.parent_id,
                          
    t.parent_id AS sequence
                  FROM categories 
    AS t
                  WHERE t
    .parent_id <> 0
                  ORDER BY sequence
    parent_id
    diese Abfrage bringt mir schonmal die richtige Reihenfolge !

    Wenn ich jetzt noch an die
    cat_name aus der categorie_description rankomme dann wäre ich glaube ich schon mal Glücklich !!


    grüße eleven
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Ähm, via LEFT JOIN ?


    Andreas
     
  6. eleven

    eleven Neuer Benutzer

    Könntest du mir bitte einen ansatzpunkt geben wo ich ansetzen sollte, ich sehe den Wald vor lauter Bäumen schon nicht mehr !

    Danke eleven
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from x;
     name
    ------
        1
        2
    (2 rows)
    
    test=*# select * from y;
     id | name
    ----+-------
      1 | name1
      2 | name2
    (2 rows)
    
    test=*# select x.name, y.name from x left join y on x.name=y.id;
     name | name
    ------+-------
        1 | name1
        2 | name2
    (2 rows)
    
    Du hast jetzt x als Resultat und in y Deine Texte, das anzupassen überlasse ich Dir zur Übung ;-)


    Andreas
     
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