Zitat von AmicaNoctis
					
						
						
							
							
							
							
								
								
								
								
									Beitrag anzeigen
								
							
						
					
				
				
			
		Array Sortieren mal anders...
				
					Einklappen
				
			
		
	X
- 
	
	
	
		
	
	
		
		
		
		
		
		
		
	
	
 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.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! :-(
 
 Heisst das jetzt mein pseudo-code ist richtig!? *fg*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! ^^
 
 Ich würde es auch mit combies Variante machen, aber die Check ich nach wie vor nicht! ^^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? [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
- 
	
	
	
		
	
	
		
		
		
		
		
		
		
	
	
 Ist es denn wirklich so schwierig?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..... Das ist alles gar nicht so schwer.....  
 Kommentar
- 
	
	
	
		
	
	
		
		
		
		
		
		
		
	
	
 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! ^^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....".
 
 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!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++; } WHILE (!$asleep) { $sheep++; }
 Kommentar
- 
	
	
	
		
	
	
		
		
		
		
		
		
		
	
	
 Welche Sorgen plagen dich?, 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... Daher ist der Thread leider noch aktuell...
 
 $x = Die Priorität meines aktuellen Elements (z.B.: 4)
 $y = Die Priorität des Folgeelements (=> 5)
 
 Würde heißen -> Wegen dem IN() hab ich 2 Updates...: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]Doch doch !!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. Nichts ändern, einfach nur verwenden. Zuletzt geändert von combie; 25.08.2009, 12:02. Zuletzt geändert von combie; 25.08.2009, 12:02.
 Kommentar
 
          
 Moderatorin
 Moderatorin
Kommentar