phpbar.de logo

Mailinglisten-Archive

[php] MySQL: Datensatz nach oben und unten verschieben

[php] MySQL: Datensatz nach oben und unten verschieben

Florian Grell grell at werk4.net
Mon Jun 11 17:33:52 CEST 2007


Hallo Simon!

> mein Problem erscheint mir eigentlich recht einfach - ich komme aber
> trotzdem nicht auf die Lösung.
>
> Eine Tabelle hat folgende spalten:
> id int not null auto_increment primary key,
> name varchar(50) not null,
> prio int not null
>
> Die Sortierung der Datensätze erfolgt durch die Spalte Prio. Nun möchte
> ich einen Datensatz nach oben und unten verschieben können. Wenn man den
> ersten Datensatz nach oben verschiebt, sollte dieser im Optimalfall an
> die letzte Stelle rutschen. Schiebt man den letzten nach unten, rutscht
> dieser an die oberste Stelle.

Sowas in der Art mache ich auch, um Einträge in einer DB nach Userwünschen
sortiert darzustellen. Bei mir heisst die Spalte "sort_order", aber das
macht im Prinzip keinen Unterschied.

Ich habe im Frontend kleine Pfeile vor den Einträgen, mit denen ein Eintrag
nach oben oder unten geschoben werden kann (jeweils eine Position zur Zeit).

Das Grundprinzip ist einfach:
- Finde die aktuelle Position des zu bearbeitenden Eintrags ($current_pos)
  SQL: SELECT sort_order FROM table WHERE id=datensatz_id
- Finde die höchste Ordnungsnummer ($max_pos)
  SQL: SELECT MAX(sort_order) FROM table
- Wo willst Du hin?
  "nach oben": $wish_pos = $current_pos - 1
  "nach unten": $wish_pos = $current_pos + 1
  Hier musst Du ggf. noch die "Optimalfall"-Regel einbauen, das dürfte aber
nicht schwer sein.
- Stelle den zu verschiebenden Eintrag ans Ende ($max_pos + 1)
  SQL: UPDATE table SET sort_order=($max_pos + 1) WHERE id=datensatz_id
- Wenn "nach oben": Verschiebe den Eintrag, der Zur Zeit an der gewünschten
Position steht um eins nach unten.
  SQL: UPDATE table SET sort_order = (sort_order + 1) WHERE sort_order <
$current_pos ORDER BY sort_order DESC LIMIT 1
- Wenn "nach unten": genau anders herum.
  SQL: UPDATE table SET sort_order = (sort_order - 1) WHERE sort_order >
$current_pos ORDER BY sort_order ASC LIMIT 1
- Setze den zu bearbeitenden Eintrag an die gewünschte Position
  SQL: UPDATE table SET sort_order = $wish_pos WHERE id = datensatz_id

So ungefähr mache ich das. Falls Du noch weitere Fragen hast, immer her
damit.

Florian Grell


php::bar PHP Wiki   -   Listenarchive