Array Sortieren mal anders...

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

  • #16
    Zitat von AmicaNoctis Beitrag anzeigen
    Ja, wenn du das Statement alleine betrachtest, schon. Aber sortier mal die erste Row ganz ans Ende der Tabelle. Bei 1000 Datensätzen führst du dieses Statement 999 Mal aus.
    Also doch lieber nicht von der DB sortieren lassen!? ^^
    WHILE (!$asleep) { $sheep++; }

    Kommentar


    • #17
      Zitat von nichtsooft Beitrag anzeigen
      Also doch lieber nicht von der DB sortieren lassen!? ^^
      Doch, schon, aber mit der Schiebevariante, nicht mit der Austauschvariante von combie, es sei denn, es sind (und bleiben) nur 10 Datensätze, dann ist es wurscht.
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #18
        Also (pseudo) nach oben verschieben:

        1) UPDATE eintrag WHERE priority = (meinopfer - 1) SET priority = priority+1 LIMIT 1
        2) UPDATE meinopfer SET priority-1 LIMIT 1

        (pseudo) nach unten verschieben:

        1) UPDATE eintrag WHERE priority = (meinopfer +1) SET priorty-1 LIMIT 1
        2) UPDATE meinopfer SET priority+1 LIMIT 1

        SRY wegen pseudo... Das Problem hierbei ist: Wie bekomme ich nach den Anweisungen wieder eine schöne incremente reihenfolge (1,2,3,....,77,...) hin!?
        Zuletzt geändert von nichtsooft; 18.08.2009, 15:19.
        WHILE (!$asleep) { $sheep++; }

        Kommentar


        • #19
          Wenn du sowieso nur jeweils einen Schritt nach oben oder unten schiebst, dann kannst du auch ohne Bedenken combies Variante benutzen. Wenn die Sprünge aber größer sein können (Beispiel unten), solltest du schieben.

          Beispiel:
          a 1
          b 2
          c 3
          d 4
          e 5
          f 6

          b soll von Stelle 2 ($from) hinter das d, also auf Stelle 5 ($to) rutschen:

          update tabelle set pos = pos + 1 where pos >= $to;
          a 1
          b 2
          c 3
          d 4
          e 6
          f 7

          update tabelle set pos = $to where pos = $from;
          a 1
          b 5
          c 3
          d 4
          e 6
          f 7

          update tabelle set pos = pos - 1 where pos > $from
          a 1
          b 4
          c 2
          d 3
          e 5
          f 6

          bzw. a c d b e f

          Der Vorteil ist, egal, wie weit du springst, es sind immer genau diese 3 updates. Bei der Austauschvariante sind es für nen Sprung um x Stellen auch x Updates. Jetzt musst du entscheiden, was in deinem Falle günstiger ist.

          PS: Für bessere Performance sollte pos (oder bei dir priority) unbedingt indiziert werden (BTree Index, also ganz normal).
          Zuletzt geändert von AmicaNoctis; 18.08.2009, 15:44.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #20
            Hab da maximal 20 Datensätze drinnen und will eigentlich immer nur um einen wert (nach oben/unten) verschieben können! Sonst müsste ich wieder ein drag&drop-dingens einbauen, damit das ganze was gleich schaut! :-(

            Zitat von AmicaNoctis Beitrag anzeigen
            Wenn du sowieso nur jeweils einen Schritt nach oben oder unten schiebst, dann kannst du auch ohne Bedenken combies Variante benutzen.
            Heisst das jetzt mein pseudo-code ist richtig!? *fg*
            Und wie bekomme ich die Werte nachher wieder sortiert (0,1,2,3,4...)?
            WHILE (!$asleep) { $sheep++; }

            Kommentar


            • #21
              dann kannst du auch ohne Bedenken combies Variante benutzen:
              Code:
              UPDATE tabelle 
                   SET priority = $x + $y - priority 
                   WHERE priority IN ($x, $y)
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #22
                Zitat von AmicaNoctis Beitrag anzeigen
                dann kannst du auch ohne Bedenken combies Variante benutzen:
                Code:
                UPDATE tabelle 
                     SET priority = $x + $y - priority 
                     WHERE priority IN ($x, $y)

                Wofür steht hier $x und $y !?
                $x = meinopfer, $y = folgender/vorangehender Eintrag!?
                WHILE (!$asleep) { $sheep++; }

                Kommentar


                • #23
                  Klickst du hier: http://www.php-resource.de/forum/php...tml#post623300
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #24
                    Irgendwie würfelt mir dieser Sortievorgang alles durcheinandern! ^^

                    PHP-Code:
                        //// Sorting DOWN; Means that the actual item changes priority with the following one...
                        
                    $step1 "UPDATE site_bloxx SET priority = ".$this_blx['priority']." WHERE priority > ".$this_blx['priority']." AND group_id = ".$this_blx['group_id']." LIMIT 1";
                        
                    mysql_query($step1) or header("Location: index.php?notice=err&fwddata=back");
                        
                    $step2 "UPDATE site_bloxx SET priority = ".($this_blx['priority'] + 1)." WHERE id = ".$this_blx['id']." AND group_id = ".$this_blx['group_id']." LIMIT 1";
                        
                    mysql_query($step2) or header("Location: index.php?notice=err&fwddata=back");

                        
                    //// Sorting UP; Means that the actual item changes priority with the previous one...
                        
                    $step1 "UPDATE site_bloxx SET priority = ".$this_blx['priority']." WHERE priority < ".$this_blx['priority']." AND group_id = ".$this_blx['group_id']." LIMIT 1";
                        
                    mysql_query($step1) or header("Location: index.php?notice=err&fwddata=back");
                        
                    $step2 "UPDATE site_bloxx SET priority = ".($this_blx['priority'] - 1)." WHERE id = ".$this_blx['id']." AND group_id = ".$this_blx['group_id']." LIMIT 1";
                        
                    mysql_query($step2) or header("Location: index.php?notice=err&fwddata=back"); 
                    Ich würde es auch mit combies Variante machen, aber die Check ich nach wie vor nicht! ^^
                    WHILE (!$asleep) { $sheep++; }

                    Kommentar


                    • #25
                      Das ist völlig logisch, denn von LIMIT 1 hab ich nie was gesagt
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #26
                        aber die Check ich nach wie vor nicht!
                        Ist es denn wirklich so schwierig?
                        Male es dir auf Papier auf.
                        Rechne es mit 2 verschiedenen Werten durch.

                        Das ist alles gar nicht so schwer.....
                        Wir werden alle sterben

                        Kommentar


                        • #27
                          Zitat von AmicaNoctis Beitrag anzeigen
                          Das ist völlig logisch, denn von LIMIT 1 hab ich nie was gesagt
                          Wenn ich kein "Limit 1" rein schmeisse, erhöht er mir alle nachfolgenden Werte um 1 und ich muss dann nochmal eine "glättungsfunktion" die mir die Werte wieder auf incerement bringt drüber laufen lassen! ^^
                          Das problem ist nämlich dass ich 3 Typen von einträgen habe-> id, group_id, name, link, priority und ich ja immer nur eine von den Gruppen (also deren Einträge) verändern will.... Daher auch das "WHERE group_id....".

                          Zitat von combie Beitrag anzeigen
                          Ist es denn wirklich so schwierig?
                          Male es dir auf Papier auf.
                          Rechne es mit 2 verschiedenen Werten durch.
                          Ich check das IN() nicht! Hab mir zwar schon durchgelesen was es macht und so, scheint mir aber hier nicht irgendwie passen; Oder ich hab's einfach nicht geblickt!
                          WHILE (!$asleep) { $sheep++; }

                          Kommentar


                          • #28
                            , scheint mir aber hier nicht irgendwie passen;
                            Welche Sorgen plagen dich?
                            Wir werden alle sterben

                            Kommentar


                            • #29
                              Soooo! Sry dass es so lange gedauert hat! Trotz Kurzurlaub hab ich's noch immer nicht! Daher ist der Thread leider noch aktuell...

                              $x = Die Priorität meines aktuellen Elements (z.B.: 4)
                              $y = Die Priorität des Folgeelements (=> 5)

                              UPDATE tabelle
                              SET priority = $x + $y - priority
                              WHERE priority IN ($x, $y)
                              Würde heißen -> Wegen dem IN() hab ich 2 Updates...:
                              1. Lauf: SET priority = 4 + 5 - 5 WHERE priority IN (4,5) => priority = 4
                              2. Lauf: SET priority = 4 + 5 - 4 WHERE priority IN (4,5) => priority = 5

                              Es hätte sich also nichts geändert...^^ Ich müsste das "IN ()" oder besser noch die Menge darin verkehrt rum angeben, dann sollte es für eine Richtung funktionieren (aufwärts/abwärts)...
                              Aber was ist mit der anderen Richtung!?
                              WHILE (!$asleep) { $sheep++; }

                              Kommentar


                              • #30
                                Würde heißen -> Wegen dem IN() hab ich 2 Updates...:
                                1. Lauf: SET priority = 4 + 5 - [COLOR="Red"]5[/COLOR] WHERE priority IN (4,5) => priority = [COLOR="#ff0000"]4[/COLOR]
                                2. Lauf: SET priority = 4 + 5 - [COLOR="#ff0000"]4[/COLOR] WHERE priority IN (4,5) => priority = [COLOR="#ff0000"]5[/COLOR]
                                Es hätte sich also nichts geändert
                                Doch doch !!
                                Wie du selber geschrieben hast, wird bei 1 die 5 zur 4 und bei 2 die 4 zur 5.
                                Und das tuts in beide Richtungen!
                                Nichts ändern, einfach nur verwenden.
                                Zuletzt geändert von combie; 25.08.2009, 12:02.
                                Wir werden alle sterben

                                Kommentar

                                Lädt...
                                X