Moin,
es ist eigentlich simpel: nehmen wir an, du sortierst nach dem Feld
id. Dir ist die ID des eigentlichen Datensatzes bekannt, d.h. du selektierst erstmal das Objekt:
SELECT * FROM foo WHERE id = %id
Anschliessend selektierst du die naechsten 2 Datensaetze:
SELECT * FROM foo WHERE id > %id ORDER BY id ASC LIMIT 2
Und zu guter Letzt noch die vorherigen beiden:
SELECT * FROM foo WHERE id < %id ORDER BY id DESC LIMIT 2
So, das waren jetzt drei. Wir koennen die ersten beiden Queries aber verbinden:
SELECT * FROM foo WHERE id >= %id ORDER BY id ASC LIMIT 3
Nun weisst du dass die erste Row des Ergebnis-Sets der eigentliche Datensatz ist und alles was nachher kommt sind die naechsten Datensaetze, und hast das Ganze in 2 Queries. Auf ein
Query runterzukommen geht eigentlich nur mit Hilfe von UNION:
SQL-Code:
(SELECT * FROM foo WHERE id < %id ORDER BY id DESC LIMIT 2)
UNION (SELECT * FROM foo WHERE id >= %id ORDER BY id ASC LIMIT 3)
ORDER BY id ASC
Hab ich grad nicht getestet, muesste aber funktionieren. Das Ding ist allerdings ein Trugschluss, da der
DB-Server intern sowieso 2 Queries ausfuehrt, von daher kannst du es uebersichtlicher halten, wenn du getrennt selektierst.
Lustiger wird das Ganze wenn du nicht ein Sortierkriterium hast, sondern mehrere. Nehmen wir an du hast einen Vornamen (
firstname) und einen Nachnamen (
lastname) und moechtest nach der Form
lastname,
firstname sortieren und selektieren. In dem Fall musst du die Sortierung selbst basteln:
SELECT * FROM foo WHERE lastname > %lastname OR (lastname = %lastname AND firstname > %firstname) ORDER BY lastname ASC, firstname ASC LIMIT 2
SELECT * FROM foo WHERE lastname < %lastname OR (lastname = %lastname AND firstname < %firstname) ORDER BY lastname DESC, firstname DESC LIMIT 2
Du kannst dir vorstellen, wie sich das Ding aufblaeht, wenn du dann 5 Kriterien drin hast
In diesem Fall ist es uebrigens fast immer geschickter, mit 3 Queries zu arbeiten. Schliesslich wird dein Datensatz wohl kaum per Vor- und Nachname definiert werden, sondern per ID. Also musst du dir erstmal die Grenzen aus der Datenbank holen, was in diesem Fall nicht mit einem Subquery oder JOIN gemacht werden sollte, da du ihn gleich zwei Mal machen musst (einmal fuer die vorherigen 2 Datensaetze, einmal fuer die nachfolgenden). Dein
DB-Server wirds dir spaetestens ab 4-stelligen Datensatzzahlen danken *g*
Greetz
alcaeus