Zitat von AmicaNoctis
Beitrag anzeigen
Array Sortieren mal anders...
Einklappen
X
-
Zitat von nichtsooft Beitrag anzeigenAlso doch lieber nicht von der DB sortieren lassen!? ^^[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
-
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
-
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
-
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 anzeigenWenn du sowieso nur jeweils einen Schritt nach oben oder unten schiebst, dann kannst du auch ohne Bedenken combies Variante benutzen.
Und wie bekomme ich die Werte nachher wieder sortiert (0,1,2,3,4...)?WHILE (!$asleep) { $sheep++; }
Kommentar
-
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
-
Zitat von AmicaNoctis Beitrag anzeigendann 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
-
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
-
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");
WHILE (!$asleep) { $sheep++; }
Kommentar
-
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
-
aber die Check ich nach wie vor nicht!
Male es dir auf Papier auf.
Rechne es mit 2 verschiedenen Werten durch.
Das ist alles gar nicht so schwer.....
Kommentar
-
Zitat von AmicaNoctis Beitrag anzeigenDas ist völlig logisch, denn von LIMIT 1 hab ich nie was gesagt
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 anzeigenIst es denn wirklich so schwierig?
Male es dir auf Papier auf.
Rechne es mit 2 verschiedenen Werten durch.WHILE (!$asleep) { $sheep++; }
Kommentar
-
, scheint mir aber hier nicht irgendwie passen;
Kommentar
-
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)
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
-
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
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.
Kommentar
Kommentar