alex: SELECT-Anweisung für folgendes Problem gesucht:

hallo...

hier habe ich mal die tabelle um die es geht:

menu_id  |  parent_id  |    label      |  sortierung
----------------------------------------------------
137      |    0      | OberPunkt 1  |    1
138      |    0      | OberPunkt 2  |    2
139      |    0      | OberPunkt 3  |    3
140      |    137    | UP1_OP 1      |    1
141      |    137    | UP2_OP 1      |    2
142      |    138    | UP1_OP 2      |    1
143      |    139    | UP1_OP 3      |    1
144      |    139    | UP2_OP 3      |    2
145      |    139    | UP3_OP 3      |    3

gibt es denn eine SELECT-Anweisung, die mir die tabelle so darstellt, das immer unter den oberpunkten die Unterpunkten (UP...) erscheinen bzw. kann man in die abfrage was mit einbauen, das nur die unterpunkte eines bestimmten oberpunktes angezeigt werden?

das menu soll so angelegt werden, das es per browser editierbar ist. (man kann z. Bsp. auswählen unter welchem oberpunkt ein neuer menüpunkt erscheinen soll oder wie die sortierung sein soll, aber damit habe ich mich jetzt noch nicht beschäftigt)

  1. Hallo,

    also, bevor wir beginnen: Du musst dir einen serverseitige programmiersprache aussuchen, und einen Datenbank. ALso z.B. php und mysql.

    menu_id  |  parent_id  |    label      |  sortierung

    137      |    0      | OberPunkt 1  |    1
    138      |    0      | OberPunkt 2  |    2
    139      |    0      | OberPunkt 3  |    3
    140      |    137    | UP1_OP 1      |    1
    141      |    137    | UP2_OP 1      |    2
    142      |    138    | UP1_OP 2      |    1
    143      |    139    | UP1_OP 3      |    1
    144      |    139    | UP2_OP 3      |    2
    145      |    139    | UP3_OP 3      |    3

    uiiiii, wird schon etwas kompliziert. Menüs in DB's zu schreiben ist gar keine schlechte idee.

    also, du musst in deine programmiersprache irgendwie ein query mit allen datensätzen bekommen, wo parent_id = 0 ist. Dann liest du sie einzeln durch und fragst zu jeder neu die datenbank ab, wo parent_id = menu_id ist. Und dann listest du das halt auf.

    So einfach ist es.
    Sort by sortierung natürlich, ok.

    bambel

    1. also, du musst in deine programmiersprache

      ich benutze php und mysql

      irgendwie ein query mit allen datensätzen bekommen, wo parent_id = 0 ist. Dann liest du sie einzeln durch und fragst zu jeder neu die datenbank ab, wo parent_id = menu_id ist. Und dann listest du das halt auf.

      So einfach ist es.
      Sort by sortierung natürlich, ok.

      ich brauche dann also 2 select-anfragen?

      1. Hallo alex,

        ich benutze php und mysql

        sehr gut :-) ich auch

        irgendwie ein query mit allen datensätzen bekommen, wo parent_id = 0 ist. Dann liest du sie einzeln durch und fragst zu jeder neu die datenbank ab, wo parent_id = menu_id ist. Und dann listest du das halt auf.

        So einfach ist es.
        Sort by sortierung natürlich, ok.

        ich brauche dann also 2 select-anfragen?

        genau. Und wenn du das, was ich geschrieben habe, also nun auf PHP überträgst, könnte das ganz simpel ungefähr so aussehen:

        Einfache Menüdarstellung in einer <ul>:

        <ul>
        <?
         // DB ist jetzt schonmal connected :-)
         $firstnode = mysql_query("SELECT * FROM deinedb WHERE parent_id = 0 SORT BY sortierung");
         while($thisnode = mysql_fetch_assoc($firstnode))  // mysql_fetch_row ist ansonsten schneller
          {
            print "<li>Punkt ".$thisnode["sortierung"].": <b>".$thisnode["label"]."</b><ul>";
            $childnodes = mysql_query("SELECT * FROM deinedb WHERE parent_id = ".$thisnode["menu_id"]." SORT BY sortierung");
            while($tnode = mysql_fetch_assoc($childnodes))
              print "<li>".$tnode["label"]."</li">; //..... etc. etc.
            print "</ul></li>"
          }
        ?>
        </ul>

        Naja, Tippfehler sind bestimmt viele drin, und ich gehe jetzt immer davon aus, dass jedes Element 1.ebene in deiner db immer "kindknoten" hat, muss eben net sein, musst du eben überprüfen (durch weitere querys)

        Ist auch nur ein Denkanstoß für dich, mehr nicht.

        Hannes

  2. yo,

    gibt es denn eine SELECT-Anweisung, die mir die tabelle so darstellt, das immer unter den oberpunkten die Unterpunkten (UP...) erscheinen bzw. kann man in die abfrage was mit einbauen, das nur die unterpunkte eines bestimmten oberpunktes angezeigt werden?

    ist ein wenig "ungenau" spezifiziert. erst einmal ein hinweis zu deiner struktur. du benutzt rekursive beziehung in der tabelle. zwar geht davon die welt nicht unter, aber rekursive beziehungen sollten vermieden werden, zumindestens aber mit vorsicht verwendet werden. deshalb ist zu überlegen, diese nicht in zwei tabellen aufzuteilen.

    nun aber zu deinen fragen. die erste SELECT anweisung kann ich mir nicht vorstellen, die zweite sollte einfach sein, indem du in der WHERE anweisung die datensatzauswahl auf den entsprechendem oberpunkt begrentzt, zum beispiel WHERE parent_id=137

    Ilja