Mailinglisten-Archive |
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