Problem mit Sortierung

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

  • Problem mit Sortierung

    Hallo,

    ich habe ein kleines Problem mit der richtigen Sortierung bei mySQL.

    Ich habe eine Menüstruktur in drei Ebenen. Dise so aufgebaut, dass es ein Feld "ebene" gibt, ein Feld "parent" und ein Feld "xorder".

    Da der Inhalt wilkürlich eingepflegt wird, kann ich nicht nach der ID gehen.

    Die Struktur sicht dann so aus: (in Klammer dahinter die ID des Eintrags, ebene, parent, xorder)

    Hauptmenu1 (ID:1, 1, 0, 1)
    - Submenu1 (ID:2, 2, 1, 1)
    --- Subsubmenu1 (ID:5, 3, 2, 1)
    --- Subsubmenu1 (ID:6, 3, 2, 2)
    - Submenu2 (ID:3, 2, 1, 2)
    - Submenu3 (ID:4, 2, 1, 3)

    Hauptmenu2 (ID:7 1, 0, 2)
    - Submenu1 (ID:9, 2, 7, 1)
    --- Subsubmenu1 (ID:10, 3, 9, 1)
    --- Subsubmenu2 (ID:11, 3, 9, 2)

    Hauptmenu3 (ID:8 1, 0, 3)
    - Submenu1 (ID:12, 2, 8, 1)

    Also mit "ebene" bestimme ich die Struktur, "parent" ordnet die unterpunkte der ID des Übergeordnetten Punkts zu und mit "xorder" bestimme ich die Sortierreihenfolge der Unterpunkte innerhalb einer Ebene.

    Nun möchte ich nach dieser Menüstruktur die Inhalte sortiert haben.
    Mit ORDER BY ebene ASC, parten ASC, xorder ACS ist die Sortierung jedoch falsch, da es mehrere Ebenen 1,2 und 3 gibt, abhängig vom jeweiligen Parent.
    Das Ergebnis momentan ist:
    Hauptmenu1
    Hauptmenu2
    Hauptmenu3
    Submenu1
    Submenu1
    Submenu1
    Submenu2
    Submenu3
    etc.

    Hat jemand irgend eine Idee, wie man das lösen kann?

    Dank&Grüße,
    Andi

  • #2
    ordne mal nur nach "parent ASC, xorder ASC"
    Kissolino.com

    Kommentar


    • #3
      Ja, das ist eigentlich die "Hauptsortierung", die muß aber jetzt irgendwie in Relevanz mit der Ebene gebracht werden.

      Da "parent" die ID des übergeordnetten Menüpunkt ist und die Struktur nicht chronologisch angelegt ist, springt da die Sortierung auch hin und her.
      Es kann also der zweite Hauptmenüpunkt nach dem fünften, bzw. auch alle Untermenüs in beliebiger Reigenfolge auftauchen, zwar in sich selbst richtig sortiert, aber eben nicht nach der Struktur.

      Oh je, ich merke schon, das ist nicht so einfach.

      Für die Sitemap habe ich mehrere Selects verschachtel. Ich dachte man könnte aber vielleicht die Sortierung auch in einer Anweisung erledigen und so viel Code sparen.

      Na dann halt doch wieder ausführlich.

      Grüße, Andi

      Kommentar


      • #4
        du hast den hauptmenüs immer dieselbe parentid gegeben (hatte ich zuerst übersehen), dann ist klar, warums nicht in einem rutsch geht.

        wie liest du die denn für die normale anzeige aus und stellst sie dar ... angenommen ich fordere subsubmenu1 an?
        Kissolino.com

        Kommentar


        • #5
          Also nun siehts so aus:

          PHP-Code:
          <?
          $res_sel = mysql_query("SELECT * FROM $db_menu WHERE ebene = 1 ORDER BY xorder asc");

          #-----------------------------------------------------------------------------------------------------------
          ### Ebene 1 ###

          while ($cur_sel = mysql_fetch_array($res_sel)){
          $myid=$cur_sel['id'];
          $parent1 = $cur_sel['id'];
          $mylayout =  $cur_sel['layout'];
          $myname =  $cur_sel['name'];

          if($mylayout == 7){
          ?>
           <tr><td width="50" height="20"><input name="page_id[]" type="checkbox" id="page_id[]" value="<? print $myid ?>"<? if(in_array($myid, $page_ids)){print " checked";}?>></td><td class="text"><? print $myname ?></td></tr>
          <?
          }

          $res_sel2 = mysql_query("SELECT * FROM $db_menu WHERE ebene = 2 AND parent ='$parent1' ORDER BY xorder asc");
          #-----------------------------------------------------------------------------------------------------------
          ### Ebene 2 ###

          while ($cur_sel2 = mysql_fetch_array($res_sel2)){
          $myid=$cur_sel2['id'];
          $parent2 = $cur_sel2['id'];
          $mylayout =  $cur_sel2['layout'];
          $myname =  $cur_sel2['name'];

          if($mylayout == 7){
          ?>
           <tr><td width="50" height="20"><input name="page_id[]" type="checkbox" id="page_id[]" value="<? print $myid ?>"<? if(in_array($myid, $page_ids)){print " checked";}?>></td><td class="text"><? print $myname ?></td></tr>
          <?
          }

          $res_sel3 = mysql_query("SELECT * FROM $db_menu WHERE ebene = 3 AND parent ='$parent2' ORDER BY xorder asc");
          #-----------------------------------------------------------------------------------------------------------
          ### Ebene 3 ###

          while ($cur_sel3 = mysql_fetch_array($res_sel3)){
          $myid=$cur_sel3['id'];
          $parent3 = $cur_sel3['id'];
          $mylayout =  $cur_sel3['layout'];
          $myname =  $cur_sel3['name'];

          if($mylayout == 7){
          ?>
           <tr><td width="50" height="20"><input name="page_id[]" type="checkbox" id="page_id[]" value="<? print $myid ?>"<? if(in_array($myid, $page_ids)){print " checked";}?>></td><td class="text"><? print $myname ?></td></tr>
          <?
          }

          $res_sel4 = mysql_query("SELECT * FROM $db_menu WHERE ebene = 4 AND parent ='$parent3' ORDER BY xorder asc");
          #-----------------------------------------------------------------------------------------------------------
          ### Ebene 4 ###

          while ($cur_sel4 = mysql_fetch_array($res_sel4)){
          $myid=$cur_sel4['id'];
          $parent4 = $cur_sel4['id'];
          $mylayout =  $cur_sel4['layout'];
          $myname =  $cur_sel4['name'];

          if($mylayout == 7){
          ?>
           <tr><td width="50" height="20"><input name="page_id[]" type="checkbox" id="page_id[]" value="<? print $myid ?>"<? if(in_array($myid, $page_ids)){print " checked";}?>></td><td class="text"><? print $myname ?></td></tr>
          <?
          }

          $res_sel5 = mysql_query("SELECT * FROM $db_menu WHERE ebene = 5 AND parent ='$parent4' ORDER BY xorder asc");
          #-----------------------------------------------------------------------------------------------------------
          ### Ebene 5 ###

          while ($cur_sel5 = mysql_fetch_array($res_sel5)){
          $myid=$cur_sel5['id'];
          $mylayout =  $cur_sel5['layout'];
          $myname =  $cur_sel5['name'];

          if($mylayout == 7){
          ?>
           <tr><td width="50" height="20"><input name="page_id[]" type="checkbox" id="page_id[]" value="<? print $myid ?>"<? if(in_array($myid, $page_ids)){print " checked";}?>></td><td class="text"><? print $myname ?></td></tr>
          <?
          }
          #-----------------------------------------------------------------------------------------------------------

          }}}}}
          ?>
          Ich dachte ich könnte das mittels einem ausgetüfteltem ORDER BY in einer Anweisung realisieren. Schon allein der Übersicht und Performance wegen.
          Schade.

          Kommentar


          • #6
            bevor du dich da in etwas verrennst, schau dir das mal an:
            http://www.php-resource.de/forum/sho...r=2#post166408
            Kissolino.com

            Kommentar


            • #7
              OK, ja...??? Was will mir das jetzt sagen?
              Da wird mit zwei Tabellen gearbeitet, oder wie verstehe ich das. Oder gehts dabei um die SQL-Anweisung?
              Auf was willst Du mich hinweisen?

              Das Problem ist, das die Struktur schon steht. Die Seite ist weit einem Jahr online und ist bereits 400 Seiten stark. Da kann ich nichts mehr dran ändern.
              Für ein paar neueu Admin-Funktionen breuchte ich jetzt eben die Struktur gelistet und dachte das geht vielleicht einfacher als so, wie ich es vor einem Jahr programmiert hate.

              Aber nun gut, so läufts halt und wenn es nicht die Ultimativlösung gibt, dann behalte ich halt den alten (umständlichen) Weg bei.

              Grüße, Andi

              Kommentar


              • #8
                ... hätte dir nur im entwicklungsstadium geholfen

                also ich wüsste sonst in deinem fall keine andere lösung als die,
                die du hast. muss aber nichts heissen ... vielleicht fällt happy oder
                tbt was schlaueres ein.
                Kissolino.com

                Kommentar


                • #9
                  Kein Problem, es geht ja jetzt so.
                  Aber Du hst recht, mag sein, dass es da doch irgend einen tollen Trick gibt. MySQL hat mich bis jetzt immer wieder überrascht. Dann bekommt man von jemandem einen Codeschnipsel, dessen Aufbau alle physikalischen Grundlagen ausser Kraft setzt, aber er funktioniert

                  Schönen Abend noch.
                  Andi

                  Kommentar

                  Lädt...
                  X