Items in verschachtelten Kategorien ausgeben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Items in verschachtelten Kategorien ausgeben

    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!

  • #2
    Nested Sets? -> http://php-resource.de/tutorials/read/21/1/

    Kommentar


    • #3
      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.
      Slava
      bituniverse.com

      Kommentar


      • #4
        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.

        Kommentar


        • #5
          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. 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!

          Kommentar


          • #6
            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.

            Kommentar


            • #7
              Also doch mittels PHP etwas zusammenfrickeln?
              Ich dachte bloß es gibt eventuell (in MySQL 5) bereits eine elegante Lösung mittels SQL-only.

              Kommentar


              • #8
                schau dir http://dev.mysql.com/tech-resources/...ical-data.html mal an.

                Kommentar


                • #9
                  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.

                  Kommentar

                  Lädt...
                  X