Array Sortieren mal anders...

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

  • nichtsooft
    antwortet
    Also dieser Querry funktioniert so gut, dass ich gleich einige verbesserungswürdige Stellen bei mir im Code gefunden habe!!!

    Vielen, vielen Dank an combie und selbstverständlich auch an alle Anderen!

    Einen Kommentar schreiben:


  • combie
    antwortet
    Nein, das ist kein Killercode.


    Aber trotzdem:
    Experimente niemals am produktiv System durchführen. Immer feißig Backups anlegen.
    Trau keinem, auch nicht dir selbst.

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    Zitat von combie Beitrag anzeigen
    Nichts ändern, einfach nur verwenden.
    ...sagte der Fachmann und lachte über den DAU der sich sein System zerstörte... *looool*

    Nene! Quatsch! Ich probier's einfach mal!
    Ich danke schon mal vorab und melde mich dann mit neuen Resultaten!

    Einen Kommentar schreiben:


  • combie
    antwortet
    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, 11:02.

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    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!?

    Einen Kommentar schreiben:


  • combie
    antwortet
    , scheint mir aber hier nicht irgendwie passen;
    Welche Sorgen plagen dich?

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    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!

    Einen Kommentar schreiben:


  • combie
    antwortet
    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.....

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Das ist völlig logisch, denn von LIMIT 1 hab ich nie was gesagt

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    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! ^^

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Klickst du hier: http://www.php-resource.de/forum/php...tml#post623300

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    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!?

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • nichtsooft
    antwortet
    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...)?

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    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, 14:44.

    Einen Kommentar schreiben:

Lädt...
X