Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Items in verschachtelten Kategorien ausgeben [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Items in verschachtelten Kategorien ausgeben


 
kuebel-s
18-03-2007, 13:26 
 
Hallo,
ich habe eine Tabelle "items" (id, catid, name) und eine tabelle "categories" (id, parentid, name).
Nun gibt das "parentid" bei "categories" an welche Oberkategorie von dieser ist, wenn es eine 0 ist, dann hat die categorie keine Unterkategorie. Nun gehört ein Item zu einer Kategorie.
Angenommen:
Item
------
id=5
catid=2
name=Trabant

Category
------------
id=2
parentid=1
name=DDR

Category
------------
id=1
parentid=0
name=Deutschland

Nun wenn ich auf meiner Webseite die Kategorie 2 aufrufe, dann soll er auch den Trabanten (5) auflisten, das ist ja kein problem, da item.catid=2 (item.catid=category.id).
Aber nun will ich, dass Trabant aufgelistet wird, wenn die Kategorie 1 aufgerufen wird, da ja Kategorie 2 eine Unterkategorie von 1 ist.

Ich denke mittels PHP wäre ja das irgendwie inzufrickeln, aber ich würde das lieber gerne direkt in SQL haben. Zumal die Tiefe der Kategorien ja auch variierert!
Danke schon einmal im voraus!

 
matz0r
18-03-2007, 13:56 
 
Nested Sets? -> http://php-resource.de/tutorials/read/21/1/

 
Slava
18-03-2007, 13:59 
 
dann muss man erst alle unterkategorie von ausgewählter finden, und dann alle items zu diesen kategorien auflischten.
um das zu realisieren gibt es mehrere möglichkeiten
von reqursiven abfragen bis zu nested sets.
nested sets wird dir zwar eine direkte abfrage per sql bieten, dafür wird aber der aufwand bei tabellenpflege enorm steigern.

 
penizillin
18-03-2007, 15:09 
 
das von kuebel-s beschriebene model ist kein "nested sets model" - es ist einfach zu realisieren (ach ja, es ist "adjacency list") und einfach zu pflegen, aber ausgerechnet diese anforderungen (hole alle blätter (indirekt) adjezent zu einem inneren knoten) ist nur mit mehreren sql anfragen realisierbar.

nested sets dagegen sieht in der tabellarischen form sehr unintuitiv aus, diese anfrage jedoch lässt sich in einer sql anfrage berechnen.

die vor- und nachteile der beiden modelle werden in vielen sql-büchern beschrieben.

 
kuebel-s
18-03-2007, 16:10 
 
Also ich habe mir vorhin eine Weile lang das Nested Set angesehen und habe es nicht wirklich als passend empfunden.
Der Vorschlag mit der Adjacency List war gut. Habe nun über Google versucht darüber was passendes zu finden, aber das einzigst gute was ich fand war das hier (http://www.sqlsummit.com/AdjacencyList.htm). Nur leider werden da keine SELECT statements auf mein Vorhaben behandelt und ich kann mir nicht wirklich eine passende query dafür ausmalen :(
Kann mir jemand eventuell eine bessere Linklektüre geben oder mich in die richtige Richtung weisen :) ?
Danke!

 
penizillin
18-03-2007, 16:41 
 
Original geschrieben von Slava
dann muss man erst alle unterkategorie von ausgewählter finden, und dann alle items zu diesen kategorien auflischten. wiederholen (rekursiv) mit allen unterkategorien.

 
kuebel-s
18-03-2007, 18:06 
 
Also doch mittels PHP etwas zusammenfrickeln?
Ich dachte bloß es gibt eventuell (in MySQL 5) bereits eine elegante Lösung mittels SQL-only.

 
penizillin
18-03-2007, 18:18 
 
schau dir http://dev.mysql.com/tech-resources/articles/hierarchical-data.html mal an.

 
DaRpH
18-03-2007, 20:20 
 
Ich hab das ganze mit temporären Tabellen und Stored Procedures gelöst.

In die temporäre Tabelle schreibe ich dann alle Kategorie IDs in eine Spalte:

Name NamenStruktur IDStruktur
"Unterkategoriename", ".Kategorie.Unterkategorie.",".1.2."

dann kann man mit LIKE .%ID%. zB alle Unterkategorien finden.

Das einzigste Problem ist diese Temporäre Tabelle muss upgedatet werden nachdem Kategorien gelöscht oder geändert werden, das ist das aufwendige daran.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:20 Uhr.