Sam: Abweichungen in der Row-Reihenfolge bei Order by und Limit

Hallo Forum!

Auf einem MySQL Server (Version 5.0.24a unter Debian Sarge) begegnete ich heute einem interessanten Problem, zu dem ich gerne schlaue Meinungen hören würde.

SITUATION
---------

Folgendes (schön vereinfachtes) Statement:

SELECT e.*, c.title AS cattitle FROM events e LEFT JOIN categories c ON c.id=e.category_id ORDER BY e.category_id DESC LIMIT 100,20

Die Ergebnismenge wird über mehrere Seiten aufgeteilt, die Seitenverteilung läuft wie üblich über die LIMIT-Klausel (Seite 6 hat "LIMIT 100,20", Seite 7 "LIMIT 120,20").

EFFEKT
------

Wenn man zwischen den Seiten wechselt, ist die Ergebnismenge nicht "stabil" - das heißt, die Reihenfolge der zurückgegebenen Rows ändert sich abhängig vom übergebenen Limit. Die Folge: einige Rows werden niemals angezeigt, da sie "wegspringen", also z.B. an Stelle 110 stehen mit "LIMIT 80,20" und an Stelle 89 mit "LIMIT 100,20".

Nach kurzem Stutzen erschien mir das Problem aber eigentlich kein richtiger Fehler in MySQL zu sein: die ORDER BY Klausel wird ja ausgeführt, nur eine Untersortierung passiert nicht.

Ich hätte aber erwartet, dass die Ergebnismenge "stabil" ist - so stellt das ganze ja ein ziemliches Problem für auf mehrere Seiten verteilte Ergebnismengen dar.

Lösen ließ sich das ganze, indem ich SQL_BUFFER_RESULT hinzufügte. Das scheint die Ergebnismenge stabil zu machen.

FRAGE
-----

Was haltet ihr davon? Wie kann man solche Probleme vermeiden? Einfach nur hoffen, dass es nicht passiert? Muss man immer auch noch nach dem Primary Key sortieren, um so etwas zu vermeiden? Wie geht ihr mit dem Problem in euren mehrseitigen Ergebnismengen um?

Viele Grüße, bin gespannt!

Sam

  1. yo,

    tabellen sind unsortierte mengen. solange du in einer abfrage nicht eine explizite sortierung angibst, ist die reihenfolge willkürlich vom dbms und kann von abfrage zu abfrage verschieden sein.

    deine sortierung alle üder die e.category_id scheint mir nicht eindeutig in der ergebnismenge zu sein, sprich ich vermute mehrere datensätze können damit vorkommen. das wird wohl dein problem sein.

    eine lösung wäre in dem falle einfach, über eine zusätzlich spalte sortieren, die die erebnismenge eindeutig macht.

    Ilja