Verschachtelte Sortierung

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

  • Verschachtelte Sortierung

    Ich bekomme eine Sortierung von Kategorien mit den zugehörigen Unterkategorien nicht hin.
    Jede Kategorie kann Unterkategorien haben, jede Unterkategorie wiederum Unterkategorien usw.

    Tabellenstruktur:
    Code:
    CREATE TABLE categories (
      c_id int(11) NOT NULL auto_increment,
      c_parent_id int(11) NOT NULL default '1',
      c_name varchar(24) NOT NULL default '',
      PRIMARY KEY  (c_id)
    ) TYPE=MyISAM;
    Einträge z.B.

    1, 1, 'TOP Level'
    2, 1, 'Zeitschriften'
    3, 1, 'Bücher'
    4, 1, 'Videos'
    5, 1, 'DVDs'
    6, 3, 'Deutsche Bücher'
    7, 3, 'Englische Bücher'
    8, 6, 'Krimis'
    9, 6, 'Romane'
    10, 6, 'Biographien'
    11, 7, 'Amerik. Literatur'
    12, 7, 'Engl. Literatur'

    Die c_parent_id ist gleich der c_id zu welcher Kategorie diese (Unter-)Kategorie angehört. c_id 1 ist die Oberkategorie, also oberste Stufe.

    Wenn eine Liste der DB-Einträge ausgegeben werden soll,
    dann soll die Sortierung nach Kategorie und der jeweiligen Unterkategorie(n) sein.
    Das wäre bei den obigen Daten:

    1, 1, 'TOP Level'
    2, 1, 'Zeitschriften'
    3, 1, 'Bücher'
    - 6, 3, 'Deutsche Bücher'
    - - 8, 6, 'Krimis'
    - - 9, 6, 'Romane'
    - - 10, 6, 'Biographien'
    - 7, 3, 'Englische Bücher'
    - - 11, 7, 'Amerik. Literatur'
    - - 12, 7, 'Engl. Literatur'
    4, 1, 'Videos'
    5, 1, 'DVDs'

    Ich hoffe, das ist soweit verständlich formuliert.
    heute bug ich, morgen browse ich...

  • #2
    kann gut sein, daß ich Dich jetzt entweder total mißverstehe, oder auf dem Schlauch, aber sollte es nicht ein einfaches
    PHP-Code:
    SELECT FROM categories ORDER BY parent_idc_id 
    tun?
    dann ist die Parent ID oberstes Sortierkriterium, und danach halt die "normale" ID. Imho sollte dann eine Sortierung wie von Dir beschrieben rauskommen.

    Kommentar


    • #3
      danke für die Antwort, funktioniert aber nicht ganz.
      Es wird auf diese Weise zwar nach der jeweiligen (Unter-)kategorie sortiert, aber nicht die jeweilige Unterkategorie zu der dazugehörigen (höheren) Kategorie.
      Und das ist genau der Punkt, woran ich scheitere
      heute bug ich, morgen browse ich...

      Kommentar


      • #4
        hmmm...komische Sache das. Ich hab leider grad keine DB zum Testen hier, aber ich schau nachher nochmal nach und editiert dann nochwas rein

        Kommentar


        • #5
          @frezno
          wie sieht denn deine abfrage aus?
          Kissolino.com

          Kommentar


          • #6
            Original geschrieben von Wurzel
            wie sieht denn deine abfrage aus?
            ???
            du meinst die, die mich nicht weiterbringt?

            PHP-Code:
            SELECT c_idc_parent_idc_name
            FROM  categories
            WHERE  c_id 

            heute bug ich, morgen browse ich...

            Kommentar


            • #7
              hmm, ich glaub nicht dass es so etwas wird.

              entweder liest du alle datensätze aus (in ein array) und durchläufst sie
              rekursiv, wobei sie sortiert werden, oder schau dir das hier mal an (als
              beispiel mit 2 tabellen):
              http://www.php-resource.de/forum/sho...highlight=baum
              geht zwar um ein menü, ist aber derselbe aufbau.
              Kissolino.com

              Kommentar


              • #8
                Die ganze Sache ist anscheinend wirklich etwas tricky.
                Beruhigt mich ja einerseits, da ich schon dachte ich bin zu doof ne einfache Query zu gestalten,
                andererseits nervts natürlich.

                Ich schau mir den Link mal in Ruhe an, vielleicht bringt mich das auf ne Idee.

                Was nicht heissen soll, dass wenn jemand anderen was einfällt, es nicht zu sagen
                heute bug ich, morgen browse ich...

                Kommentar


                • #9
                  wenn ich das richtig verstehe, stimmt da mehreres nicht:

                  - in der auflistung hat die c_id nichts zu suchen, die ist nur für die "innere ordnung"

                  - die abfrage "... WHERE c_id > 1" ist überflüssig, damit werden alle sätze ausgewählt

                  - m.e. fehlt ein datenfeld, das eine untergliederung von c_parent bildet, z.b. c_child. nach meinem ansatz würden z.b. die zeitschriften (c_parent = 1) so erfasst sein:

                  c_id, c_parent_id, c_child, c_name

                  c_id, 1, 1, 'TOP Level'
                  c_id, 1, 2, 'Zeitschriften'
                  c_id, 1, 3, 'Bücher'

                  - dann würde die abfrage lauten:

                  SELECT * FROM categories order by c_parent, c_child

                  war das so gemeint?
                  gruss oskar40

                  kapieren - nicht kopieren

                  Kommentar


                  • #10
                    @oskar40
                    dein select is aber nich so flexibel, dass es auf eine beliebig tief verschachtelte struktur passt

                    c_child fehlt nicht!
                    Code:
                    c_id | c_parent | titel
                       1 |        0 | 1
                       2 |        1 | 1.1
                       3 |        1 | 1.2
                       4 |        2 | 1.1.1
                       5 |        1 | 1.3
                       6 |        2 | 1.1.2
                       7 |        4 | 1.1.1.1
                    das stimmt so
                    c_parent = 1 heißt: parent is der eintrag bei dem c_id den wert 1 hat
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Original geschrieben von oskar40
                      [B]wenn ich das richtig verstehe, stimmt da mehreres nicht:

                      - in der auflistung hat die c_id nichts zu suchen, die ist nur für die "innere ordnung"
                      nicht ganz, die c_id entspricht der c_child in deinem Beispiel

                      - die abfrage "... WHERE c_id > 1" ist überflüssig, damit werden alle sätze ausgewählt
                      stimmt, steht auch nur von der Originalen Query drin.
                      Die Kategorie 1 ist festgeschrieben da Top Kategorie, wird aber nicht angezeigt. Damit sollte nur verhindert werden, dass jemand eine Kategorie mit ID 1 anlegt.

                      - m.e. fehlt ein datenfeld, das eine untergliederung von c_parent bildet, z.b. c_child.
                      damit ist es mE doch genau das gleiche, was ich mache. Die c_child hat die gleichen Daten wie die c_id.
                      Oder sehe ich da was falsch?
                      heute bug ich, morgen browse ich...

                      Kommentar


                      • #12
                        Ich hab jetzt nochmal was ausprobiert,
                        kommt der Sache schon näher, aber noch so wirklich:

                        PHP-Code:
                        SELECT  c_idc_parent_idc_name
                        FROM    categories
                        WHERE   c_id 
                        1
                        ORDER BY 
                        CASE WHEN c_parent_id 1
                             THEN  c_id
                             
                        ELSE  c_parent_id
                        END
                                 
                        c_name 
                        heute bug ich, morgen browse ich...

                        Kommentar


                        • #13
                          vergiss es

                          mit einem einfachen select wirst du das nie im leben beliebig tief schachteln können

                          les dir den von wurzel geposteten link mal durch, da is ne recht gute lösung drin

                          oder das hier: http://www.php-resource.de/forum/sho...ghlight=men%FC (basiert auf der idee aus wurzels link)
                          Zuletzt geändert von mrhappiness; 20.10.2003, 14:40.
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            q.e.d.
                            heute bug ich, morgen browse ich...

                            Kommentar


                            • #15
                              was genau?
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X