# "Verschieben" von Datensätzen



## Every_b (5. Dezember 2007)

Hallo Leute!

Ich habe ein Script geschrieben, schon etwas her, in der einfach Datensätze hinzugefügt werden können, gelöscht, Editiert.
Jeder Datensatz besitzt eine SortID - bei Hinzufügen eines neuen Datensatzes, erhöht sich JEDE andere SortID um 1, damit ich dann nach SortID sortieren kann und meine Reihenfolge habe. (Neuesten oben usw.)

Nun scheitere ich daran:
Ich möchte, dass man die Datensätze verschieben kann.
Sprich wie man es kennt: Pfeil nach oben oder pfeil nach unten.
Das Problem dabei:
Wenn ich z.B. zwischendrin einen Datensatz lösche, entstehen Lücken in der SortID (also nicht 1, 2, 3, 4 - sondern manchmal 1,4,5,8,9)

Hat jemand irgendeine Idee wie ich es mit diesem SortID System realisieren kann?!
Eine Idee: Die nächst höhere/niedrigere SortID auslesen, und dann die eigene SortID eins drüber/niedriger. (Wie das geht? Ich habe leider keine Ahnung ) Das würde zwar vorraussetzen dass ich alle SortIDs beim Hinzufügen um 2 erhöhe, damit Lücken zwischen den Werten entstehen, aber das ist ja kein Problem.

Falls noch Fragen offen sind, bitte fragt  
Wäre euch seehr dankbar wenn ihr mir helfen könnt.


----------



## Gumbo (5. Dezember 2007)

Aber es ist doch eigentlich egal, ob die Nummer zur Bestimmung der Reihenfolge fortlaufend oder aber unterbrochen ist. Denn sortiert wird in beiden Fällen identisch.


----------



## Every_b (5. Dezember 2007)

Da hast du Recht Gumbo, vielleicht habe ich mich da falsch ausgedrückt ^^
Sie muss für mich nicht in Reihenfolge und schon gar nicht fortlaufend sein, Lücken werden so und so entstehen, wenn mittendrin Datensätze gelöscht werden.

Das Ziel ist einfach: Die SortID des Datensatzes den ich verschieben will, um einen Wert höher/niedriger zu bringen als der NÄCHST höhere/niedrigere, damit neu sortiert wird und der Datensatz dementsprechend die position verändert.

Hoffe es ist klar was ich meine  Wenn nicht einfach fragen


----------



## Gumbo (5. Dezember 2007)

Prinzipiell müsste es wie folgt funktionieren: SortID wird verringert (?_neue Position_? < ?_alte Position_?):
	
	
	



```
UPDATE `Tabelle` SET `SortID` = `SortID`+1 WHERE `SortID` BETWEEN ?neue Position? AND ?alte Position?-1;
UPDATE `Tabelle` SET `SortID` = ?neue Position? WHERE `ID` = ?ID?
```
Beziehungsweise erhöht (?_neue Position_? > ?_alte Position_?):
	
	
	



```
UPDATE `Tabelle` SET `SortID` = `SortID`-1 WHERE `SortID` BETWEEN ?alte Position?+1 AND ?neue Position?;
UPDATE `Tabelle` SET `SortID` = ?neue Position? WHERE `ID` = ?ID?
```
Wobei ?_ID_? die ID des zu verschiebenden Datensatzes ist.


----------



## Every_b (5. Dezember 2007)

Ich verstehe die Lösung von dir noch nicht ganz, aber ich probiers gleich mal aus, bei mir dauerts manchmal ein wenig bis es klick macht ^^ danke schonmal im Vorraus, ich melde mich wenn ich dahinter gekommen bin!


----------



## Darian (11. Februar 2009)

Hallo Leute,

ich weiß dieser Beitrag ist schon alt, aber ich muss da doch auch noch einmal ein wenig meinen Senf dazu geben.

Ich habe derzeit das selbe Problem, und in meinem Fall ist es wie folgt:



> Prinzipiell müsste es wie folgt funktionieren: SortID wird verringert (?neue Position? < ?alte Position?):


Also wenn SortID verringert wird, verschiebt sich der Eintrag um eines nach oben.

Ich habe ja die ID des Eintrags, und somit auch die SortID (=alte Position) aber wie komme ich jetzt zu der neuen Position.
Kann ich doch damit es in Reihenfolge bleibt folgendes annehmen: (neue Position) = (alte Position)-1
Dann werden zwar die Löcher immer ein wenig verschoben, aber es bleibt doch in Reihenfolge.

Woher weiß ich jetzt jedoch welcher Eintrag, der mit der nächst kleineren SortID ist?
Kann ich irgendwie den Datensatz mit einer SQL Funktion abfragen?

Dann habe ich zwei IDs, ich vertausche die SortIDs und fertig

Leider ist mir dein Query auch nicht so wirklich klar.

lg und danke für eventuelle Infos
Darian


----------



## kuddeldaddeldu (11. Februar 2009)

Hi,



Darian hat gesagt.:


> Woher weiß ich jetzt jedoch welcher Eintrag, der mit der nächst kleineren SortID ist?
> Kann ich irgendwie den Datensatz mit einer SQL Funktion abfragen?



Anders ausgedrückt, brauchst Du einen Datensatz, dessen SortID kleiner ist, als die momentane, und davon den mit der höchsten. In SQL:


```
SELECT id FROM tabelle 
   WHERE SortID < aktuelle_SortID 
   ORDER BY SortID DESC LIMIT 1
```



Darian hat gesagt.:


> Dann habe ich zwei IDs, ich vertausche die SortIDs und fertig



Wenn der Eintrag immer nur um eine Position verrutschen soll, ja.



Darian hat gesagt.:


> Leider ist mir dein Query auch nicht so wirklich klar.



Damit kannst Du einen Eintrag an eine bestimmte Position rutschen lassen, auch wenn mehrere Einträge dazwischen liegen. Die werden durch die Query neu berechnet.

LG


----------



## Darian (11. Februar 2009)

Stimmt, muss ich mir merken, hat wunderbar funktioniert.

Danke für die Infos.

lg Darian


----------



## hey1234 (18. November 2010)

Also auch wenn ich jetzt wahrscheinlich als ziemlich doof rüberkomme, aber kann mir jemand das script nochmal coden. Bei mir wird das script mit BB-Codes angezeigt!


```
UPDATE `Tabelle` SET `SortID` = `SortID`+1 WHERE `SortID` BETWEEN ?neue Position? AND ?alte Position?-1;
UPDATE `Tabelle` SET `SortID` = ?neue Position? WHERE `ID` = ?ID?
```

und 


```
UPDATE `Tabelle` SET `SortID` = `SortID`-1 WHERE `SortID` BETWEEN ?alte Position?+1 AND ?neue Position?;
UPDATE `Tabelle` SET `SortID` = ?neue Position? WHERE `ID` = ?ID?
```


----------

