Seitenaufteilung mit LIMIT und ORDER BY

mehirc

Mitglied
Also ich hab mich jetzt mal umgeguckt, aber überall nur Lösungen gefunden die die Sortierung nicht so berücksichtigen wie ich sie brauche. Deswegen hab mich jetzt doch dafür entschieden euch mit einem weiteren Seitenaufteilungs-Thread zu belästigen. Nicht böse sein, falls ich doch etwas übersehen habe.

Hier mal mein Problem bzw. meine Vorstellung wie das funktionieren soll. Ich rufe eine PHP-Seite auf die aus einer Datenbank die Datensätze holt und als Tabelle auflistet. Durch Klick auf eine Spaltenüberschrift wird die Seite dann neu geladen und bekommt per GET das Sortierungkriterium für die neue SELECT-Anweisung mitgeteilt.

Nun möchte ich das ganze gerne auf mehrere Seiten aufteilen. Dabei soll die Tabelle aber weiterhin nach jeder Spalte sortierbar sein und zwar soll nur das sortiert werden was ich auch sehe. Das Problem ist, dass bei der SELECT-Abfrage erst ORDER BY und dann LIMIT stehen muss. Deshalb werden zuerst _alle_ Datensätze sortiert bevor ich die Datensätze für eine Seite rauspicken kann. Wenn ich also die ersten 10 Datensätze der ersten Seite hole und dann die Tabelle nach irgendwas sortiere, bekomme ich nicht die gleichen 10 sortiert zurück.

Jetzt ist meine Frage ob das überhaupt irgendwie mit SQL zu lösen ist. Vielleicht sollte man sowas ja generell über Array-Funktionen machen, evtl. ist das sogar schneller. Ich weiss es leider nicht und würde mich freuen wenn mir jemand dazu einen Rat geben könnte.

mehirc
 
du kannst bei der order-by-klausel mehrere kriterien angeben.
z.b. select * from exfreundin order by name, beziehungsdauer, haarfarbe limit 10;
das bringt dir dann:
anke, 10, rot
anne, 12, braun
anne, 117, blond
annett,2, blond
annett,2, schwarz
usw.
 
Danke erstmal für deinen Tip, daran hatte ich tatsächlich nicht gedacht. Aber das hat mir leider nicht weitergeholfen.

Ein weiteres ORDER BY-Kriterium sortiert nur die Datensätze in denen das vorherige Kriterium den gleichen Wert hat. Ausserdem geschieht das ja immernoch vor dem Limit und wird somit auf alle Datensätze angewendet.

Ich könnte aber zu der Select Abfrage gleichzeitig ein UPDATE auf eine extra Spalte machen in der ich die ausgewählten Datensätze markiere. Dann könnte ich das so machen wie du meintest. Aber dann kann ich das auch mit WHERE filtern, das ja vor ORDER BY angewendet wird.

Die Frage ist dann nur ob die vielen Zugriffe auf die Datenbank Sinn machen und nicht vielleicht die Sache zu sehr verzögern. Vielleicht sollte ich mal im PHP-Forum nachfragen wieviel Aufwand eine solche Sortierung innerhalb eines Arrays bedeutet.
 
Wenn mySQL das unterstützt musst hier wohl mit SUBSELECT arbeiten.
Im inneren schränkst du den Bereich nach deinen Sätzen / Seiten ein,
im äußeren sorgst du für die richtige Sortierung;

Code:
SELECT * 
FROM
   ( SELECT * FROM TABELLE ORDER BY derPrimärschlüssel LIMIT 30, 40 )
ORDER BY wunschfeld;
 
Danke für die Anregung. :)

Mit MySQL gehen Subselects wohl leider nicht, aber ich hab eine Möglichkeit gefunden die gar nicht so übel ist.

Eine temporäre Tabelle erstellen mit gewünschten Datensätzen:
Code:
CREATE TEMPORARY TABLE tbl_temp SELECT * FROM tabelle ORDER BY id LIMIT 10,20;

Datensätze nach Wunsch sortiert rausholen:
Code:
SELECT * FROM tbl_temp ORDER BY wunschfeld;

Bei Seitenwechsel die temporäre Tabelle vorher löschen:
Code:
DROP TABLE tbl_temp;

So hat man stets eine Tabelle mit der aktuellen Seite und kann beliebig darauf zugreiffen.

Ich glaub das Thema hat sich somit für mich erledigt. Vielen Dank nochmal für eure Hilfe. :)
 
Zurück