Sven Rautenberg: Postition im Resultset?

Beitrag lesen

Moin!

ich möchte eine datensatznavigation basteln, bei der ich von einer anderen seite komme, die eine beliebig ausgewählte id übergibt. d.h., ich steige auf meiner neuen seite sozusagen irgendwo in der mitte der ergebnisse meiner mysql_query ein. nun möchte ich von hier weg vor und zurücknavigieren. wenn ich von der übergebenen id als startpunkt ausgehe, habe ich das problem, dass ich ja nicht weiß, wie die vorigen/nächsten ids lauten (es können ja z.B. zahlen übersprungen sein).

Das Problem ist, dass du in deiner Überlegung, ohne es zu bemerken, gleich einen ganzen Haufen von Querys zusammenfaßt, obwohl diese nicht zusammengefaßt werden dürfen.

Du hast den Query der Übersichtsseite. Wenn du dann eine Detailseite aufrufst, hast du den Query dieser Detailseite. Und wenn du vorwärts oder zurück navigieren willst, hast du nochmal zwei weitere Querys.

Keiner dieser Querys hängt wirklich mit einem anderen Query zusammen. Allein schon deshalb, weil ja nur kurz das jeweilige Skript aufgerufen wird, die Datenbank abfragt, die Daten in HTML schreibt, zum Browser schickt, und dann alle Daten wieder komplett vergißt. In der Zwischenzeit kann sich in der Datenbank durch andere Benutzer außerdem eine Menge tun.

Außerdem hat eine Datenbank per Definition erstmal keine Reihenfolge, d.h. die Datensätze sind grundsätzlich wild durcheinander, es gibt kein "vorne/hinten" - außer du definiert eine Sortierreihenfolge. Erst DANN gibt ist die Reihenfolge der abgefragten Datensätze definiert und liegt fest.

Das gilt allerdings schon nicht mehr für die nächste gleichlautende Abfrage, denn in der Zwischenzeit können ja neue Datensätze dazu gekommen oder entfernt worden sein.

deswegen hab ich mir gedacht, es wäre doch elegant, den wert der aktuellen reihe auszulesen und von hier mit plus/minus 1 weiterzu"surfen". ich denke, das wäre doch ein hübscher ansatz für eine einfache navigation, oder nicht? wie gesagt, mysql_row_tell() wäre glaub ich genau das, was ich suche, scheint aber nicht in php zu funktionieren...

row_tell würde dir innerhalb eines einzigen Skriptaufrufes sagen, das wievielte Ergebnis du schon aus der Datenmenge abgerufen hast. Diese Information ist allerdings relativ wertlos, weil du PHP-seitig auch selbst mitzählen könntest, wieviele Datensätze du schon ausgegeben hast. Und üblicherweise will man sowieso ALLE Datensätze, die man abgefragt hat, ausgeben - ansonsten würde man die Abfrage so gestalten, dass man nur genau die Datensätze erhält, die man benötigt, und keine Datensätze ungenutzt wegwerfen. Dieser Ansatz hilft dir also überhaupt nicht.

Die Grundsatzfrage ist halt: Willst du in den Livedaten der Datenbank navigieren, d.h. zwischenzeitliche Änderungen auch echt sehen. Oder willst du einen Schnappschuß eines zu einer bestimmten Zeit gültigen Zustands durchnavigieren. Die erste Methode ist relativ einfach zu programmieren, die zweite Methode sehr aufwendig.

Nur als Denkansatz: Wenn du eine eindeutige Sortierung hast, z.B. nach einer ID, und du willst den Datensatz "davor" sehen, dann frage nach der größten ID, die kleiner als die aktuelle ID ist. Für den Datensatz danach frage nach der kleinsten ID, die größer als die aktuelle ID ist.
Davor: "WHERE id < $aktuelle_id ORDER BY id DESC LIMIT 1"
Danach: "WHERE id > $aktuelle_id ORDER BY id ASC LIMIT 1"

Sowas bereitet allerdings Probleme, wenn du mehrere Datensätze hast, die identische Daten im Feld stehen haben, und dieses Feld das einzige Sortierkriterium ist. Du mußt also dafür sorgen, dass z.B. die Sortierung nach Nachname immer eindeutig ist, indem du ein garantiert eindeutiges Feld (UNIQUE- oder PRIMARY-Index autoincrement) mindestens als allerletztes Sortierkriterium hinzufügst.

- Sven Rautenberg

--
"Love your nation - respect the others."