Sven Rautenberg: MySQL: arbeiten mit Limit

Beitrag lesen

Moin!

Mal angenommen, du listest 10 Datensätze pro Seite und hast insgesamt 14 Datensätze. Du zeigst Seite 1 an. Alles ist wunderbar. Dann werden 4 Datensätze dieser Seite geändert. Dann blätterst du auf Seite 2. Dort kriegst du exakt die 4 geänderten Datensätze gezeigt. Die 4 Sätze, die vorher dort gewesen waren, sind aufgrund deiner Timestamp-Sortierung auf Seite 1 gewandert, wurden also nie angezeigt.

Nein, die sind ja noch nicht angezeigt worden, also liegen sie im Query noch über dem Aufsetzpunkt (Timestamp + ID). Wenn ich stur Offset und Limit benutzen würde, dann hättest Du (glaube ich) Recht.

Falsch gedacht.

Ich drösel das noch mal auf (und mach das Beispiel kleiner).

Zustand vorher:
id timestamp daten
 1  10:23     alt1
 2  10:24     alt2
 3  10:25     alt3
 4  10:25     alt4
99  10:26     alt5

Jetzt werden je Seite 3 Datensätze angezeigt. Also zuerst mal Seite 1:
SELECT * FROM tabelle WHERE timestamp > 10:23 ORDER BY timestamp LIMIT 1,3
id timestamp daten
 1  10:23     alt1
 2  10:24     alt2
 3  10:25     alt3

Während der Benutzer diese Anzeige genießt, werden ein paar Änderungen eingespielt. Zustand der Tabelle danach:
id timestamp daten
 1  11:13     neu1
 2  10:24     alt2
 3  10:25     alt3
 4  11:15     neu2
99  10:26     alt5

Und jetzt will der Benutzer Seite 2 sehen.
SELECT * FROM tabelle WHERE timestamp > 10:23 ORDER BY timestamp LIMIT 4,3

Das wäre die sortierte Tabelle:
id timestamp daten
 2  10:24     alt2
 3  10:25     alt3
99  10:26     alt5
 1  11:13     neu1
 4  11:15     neu2

Und durch das Limit kriegst du das als Ergebnis:
id timestamp daten
 1  11:13     neu1
 4  11:15     neu2

Datensatz 1 hattest du aber schon gesehen. Datensatz 99 hingegen siehst du gar nicht.

Ich denke schon sehr lange über solche Probleme nach und habe auch schon die verschiedensten Lösungen entwickelt (und verkauft) aber eben noch nicht für "Internettechnologie". Das Problem hier ist, dass kein Messaging (Serverpush) über den Netzwerksocket des Clients möglich ist.

Genau das ist das Problem. Und es ist nicht lösbar.

Und selbst wenn du mit der Timestamp arbeitest und die zuletzt angezeigte Timestamp, bzw. das bis dahin angezeigte Maximum der Timestamps speicherst, fallen dir eben beim Weiterblättern alle Einträge mit späteren Daten weg.

Blättern ist eben im wörtlichen Sinne nicht möglich. Du kannst sehr wohl "aktualisierte Daten seit Datum X" anzeigen lassen. Alle untereinander aufgelistet. Und der Reload zeigt dann seit letztem Reload-Zeitpunkt neu hinzugekommene Daten. Wieder fein untereinander aufgelistet. Wenn du viele Datenbankbewegungen hast, wird das aber schnell lang und unübersichtlich. Dann kannst du für "echtes" Blättern eigentlich nur DHTML benutzen, indem du die lange Liste in handliche Häppchen aufteilst und das Blättern auf dem Client erledigst. Das Problem ist dann eben, dass sich die angezeigten Datensätze währenddessen ändern können. Zur simplen Ansicht ist das kein Problem - es wird spannender, wenn der Client auch was ändern können soll. Dann wirst du um ein Locking des Datensatzes nicht herumkommen, oder um ausgefeilte DIFF/Merge-Techniken.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)