JOIN inerrhalb einer Tabelle zum auslesen der Kategorien

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

  • JOIN inerrhalb einer Tabelle zum auslesen der Kategorien

    Hallo,

    ich habe folgendes Problem und möchte das nur ungern über eine PHP Schleife erledigen.

    Ich habe eine Kategorietabelle mit 2 Spalten:

    Kategorie und Elternkategorie

    Es kann also jede Kategorie auch eine Elternkategorie sein, mal zum Beispiel:

    Code:
    +---------------+-----------+
    | categories_id | parent_id |
    +---------------+-----------+
    |             1 |         0 | 
    |             2 |         0 | 
    |             3 |         2 | 
    |             4 |         9 | 
    |             5 |         9 | 
    |             6 |         9 | 
    |             7 |         9 | 
    |             8 |         0 | 
    |             9 |         0 | 
    |            10 |         9 | 
    |            11 |         8 | 
    |            12 |         9 | 
    |            13 |         9 | 
    |            14 |         2 | 
    |            15 |         2 | 
    |            16 |         2 | 
    |            17 |         9 | 
    |            18 |         0 | 
    |            19 |         2 | 
    |            20 |         9 | 
    |            21 |         0 | 
    |            22 |        21 | 
    |            23 |         2 | 
    |            24 |         2 | 
    |            25 |         3 | 
    |            26 |         3 | 
    |            27 |         3 | 
    |            28 |         3 | 
    |            29 |         3 | 
    |            30 |         8 | 
    |            31 |         8 | 
    |            32 |        18 | 
    |            33 |        18 | 
    |            34 |        18 | 
    |            35 |         9 | 
    |            36 |         9 | 
    |            37 |         9 | 
    |            38 |         9 | 
    |            39 |         9 | 
    |            40 |         0 | 
    |            41 |        40 | 
    |            42 |         8 | 
    |            43 |         8 | 
    |            44 |        40 | 
    |            45 |        40 | 
    |            46 |        40 | 
    |            47 |         8 | 
    |            48 |        21 | 
    |            49 |         8 | 
    |            50 |        40 | 
    |            51 |        18 | 
    |            52 |        40 | 
    |            53 |        40 | 
    |            54 |         8 | 
    |            55 |         9 | 
    |            56 |         8 | 
    |            57 |         8 | 
    |            58 |         8 | 
    |            59 |         9 | 
    |            60 |         0 | 
    |            61 |        60 | 
    |            62 |        60 | 
    |            63 |        21 | 
    |            64 |         9 | 
    |            65 |        60 | 
    |            66 |         0 | 
    |            67 |        66 | 
    |            68 |        66 | 
    |            69 |        40 | 
    |            70 |        21 | 
    |            71 |         9 | 
    |            72 |        60 | 
    |            73 |        40 | 
    |            74 |         8 | 
    |           138 |       137 | 
    |           139 |       150 | 
    |           140 |       137 | 
    |           141 |       150 | 
    |           142 |       150 | 
    |           143 |       137 | 
    |           144 |       137 | 
    |           145 |         8 | 
    |           146 |         8 | 
    |           147 |         9 | 
    |           148 |        79 | 
    |           149 |        80 | 
    |           150 |       137 | 
    |           151 |        77 | 
    |           152 |       148 | 
    |           153 |        81 | 
    |           154 |        84 | 
    |           155 |       149 | 
    |           156 |        76 | 
    |           158 |       151 | 
    |           159 |       158 | 
    |           160 |       158 | 
    |           161 |       158 | 
    |           162 |       158 | 
    |           163 |       158 | 
    |           164 |       158 | 
    +---------------+-----------+
    Ich nehme jetzt die Kategorie 164 und sehe, dass diese mit 158 verknüpft ist und diese wiederum mit 151, 151 mit 77 usw.

    Wie kann ich das aber abfragen ausgehend von einer vorgegeben Kategorie ID.

    Ich habe schon viel mit joins rumexperimentiert, aber nicht hat zu einem Ergebnis geführt. Ich bin als für jeden Vorschlag offen.

    Eine PHP-Schleife sollte nur die letzte Lösung sein.

    Vielen Dank im Voraus.

    Michael

  • #2
    Hi,

    mit einem Adjacency List Model kommst Du um eine Schleife bzw. Rekursion nicht herum.
    Hier hast Du Lesestoff. Die dort angesprochene Alternative ist auch unter der Bezeichnung "Nested Sets" bekannt.

    LG

    Kommentar


    • #3
      Danke für den Link.

      So hatte ich es schon, aber jetzt ist mir klar das es wohl eben nicht in der Datenbank geht, sondern die Abfrage über eine Schleife erfolgt.

      Mein Traum war es, die Daten quasi schon fertig aus der Datenbank zu bekommen.

      Danke und beste Grüsse.
      Michael

      Kommentar


      • #4
        Schau dir mal Nested Sets an.

        Siehe auch:
        http://dev.mysql.com/tech-resources/...ical-data.html

        Kommentar


        • #5
          Vielleicht mal einen solchen Ansatz testen:
          SELECT *
          FROM a AS node, a AS parent
          WHERE node.categories_id =2
          OR parent.parent_id = node.categories_id
          GROUP BY node.categories_id
          ORDER BY node.categories_id
          Tabelleninhalt:
          categories_id parent_id
          1 4
          2 1
          3 2
          4 2
          5 1
          6 1
          Ausgabe (gesucht nach 2)

          categories_id parent_id categories_id parent_id
          1 4 2 1
          2 1 1 4
          4 2 1 4
          2 ist mit 1, 1 mit 4 und 4 mit 2 verbunden.

          Kommentar


          • #6
            Zitat von piratos Beitrag anzeigen
            Vielleicht mal einen solchen Ansatz testen:
            Tabelleninhalt:
            Ausgabe (gesucht nach 2)

            2 ist mit 1, 1 mit 4 und 4 mit 2 verbunden.
            Ist auf eine fixe Anzahl an Ebenen begrenzt.

            Außerdem würde ich empfehlen keine Theta-Style Joins zu verwenden, weil die mit der Größe ziemlich unübersichtlich werden.

            Kommentar


            • #7
              Ich denke die Sache mit den nested Sets ist schon die beste, weil eben flexibel in der Hierarchie.

              Das Problem mit zu viel Joins ist natürlich auch, dass man damit ganz schön die Datenbank quält.

              Grüsse
              Michael

              Kommentar


              • #8
                Ich gehe zunächst davon aus was ein Frager hat und das war ein funktionierender Lösungsansatz.

                Wenn er neu aufbaut - es gibt auch andere Hierarchiemodell die durchaus ihre Vorteile haben, das wird jeder wissen der mal eine Entscheidung für oder gegen NS treffen musste.

                NS selbst ist keine Sache die man by the fly vollständig geproggt hat.

                Und wer sicher gehen will sollte da unbedingt mit Transactionen und Mysql InnoDB arbeiten.
                InnodDB hat aber neben Vorteilen auch Nachteile - das muss man wissen.

                Also dann viel Spass mit NS.

                Kommentar


                • #9
                  Hi,

                  Zitat von francosdad Beitrag anzeigen
                  So hatte ich es schon, aber jetzt ist mir klar das es wohl eben nicht in der Datenbank geht, sondern die Abfrage über eine Schleife erfolgt.
                  Ich hatte Dir den Link ja auch wegen der dort vorgestellten Alternative (MPTT auch bekannt als Nested Sets, wie auch h3ll sie Dir empfiehlt) gepostet. Der Artikel hat 3 Seiten.

                  Zitat von piratos Beitrag anzeigen
                  Ich gehe zunächst davon aus was ein Frager hat und das war ein funktionierender Lösungsansatz.
                  Aber in seinem Eingangspost ist doch deutlich zu sehen, dass er mehr als nur eine Unterebene hat und einen gesamten Pfad auslesen will...

                  Zitat von piratos Beitrag anzeigen
                  Wenn er neu aufbaut - es gibt auch andere Hierarchiemodell die durchaus ihre Vorteile haben, das wird jeder wissen der mal eine Entscheidung für oder gegen NS treffen musste.
                  Mag sein. Dann schlag ihm doch ein Modell vor, dass Deiner Meinung nach besser geeignet ist für seinen Anwendungsfall.

                  LG

                  Kommentar

                  Lädt...
                  X