select abfrage Kategoriebaum

eleven

Neuer Benutzer
Beiträge
3
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
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

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
 

ukulele

Datenbank-Guru
Beiträge
4.582
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.
 

eleven

Neuer Benutzer
Beiträge
3
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
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

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
 
Oben