2016-12-14 7 views
0

Ich habe eine SQL-Tabelle mit dem Namen articles, aus dem ich Reihen von Seiten geladen. My SQL istSQL: Paging ohne Wiederholung von einer dynamischen Tabelle

SELECT ... 
ORDER BY $orderCol DESC 
LIMIT $offset, $numPerPage 

Auf der ersten Seite der Grenze 0, $numPerPage ist auf Seite zwei, es ist $numPerPage, 2 * $numPerPage usw.

Das Problem: Wenn eine neue Zeile vor Seite 2 eingesetzt wird geladen, der letzte Artikel von Seite 1 wird der erste Artikel auf Seite 2 usw. sein. Wie kann ich das vermeiden?

Ich dachte über eine WHERE Klausel, um Artikel beginnend von der letzten $orderCol, aber dieses Feld ist nicht einzigartig (es ist ein Datum in meinem Fall), so werde ich Artikel mit dem gleichen Wert hier verpassen. Der primäre Index ist auch ein Problem, weil er nicht in der gleichen Reihenfolge angeordnet ist wie $orderCol

Es ist nicht notwendig, dass die neu hinzugefügte Zeile an einem beliebigen Punkt erscheint. Dies erfordert eine Aktualisierung.

+0

Ich denke, der einzige Weg, dies zu vermeiden wäre, die gesamte Ergebnismenge zu cachen, was nicht sehr nett ist. Aber wenn man den Advokaten des Teufels spielt, was ist falsch daran, diesen neuen Rekord auf Seite 2 zu haben? Ich würde es bevorzugen, genaue und aktuelle Informationen in meinen Abfrageergebnissen zu erhalten. –

+0

@TimBiegeleisen Es macht mir nichts aus, wenn der NEW-Eintrag auf Seite 2 erscheint, aber ich möchte den gleichen Eintrag nicht zweimal anzeigen – Dotan

+0

Sie werden den gleichen Eintrag nicht zweimal anzeigen, wenn jede Seite über eine neue Abfrage erfolgt. Ja, das gleiche Objekt scheint "zweimal" zu erscheinen, aber so verhalten sich die meisten Webseiten. Sehen Sie sich einfach die neue Fragenseite von Stack Overflow an. Benutzer sind an dieses Verhalten bereits gewöhnt. –

Antwort

0

Die Lösung, die ich gefunden habe, ist eine Bedingung in der WHERE-Klausel hinzuzufügen.

Rahul schlug vor, dass ich die neuen Artikel seit der vorherigen Abfrage zählen und sie dem Offset hinzufügen sollte. Das war schwierig, da das Zählen der Artikel bedeuten würde, dass ich eine Abfrage ausführen kann, die dort aufhört, wo die vorherige begann, und wenn ich einen Weg dazu hätte, könnte ich genauso einfach die zweite Abfrage starten, wo die erste endete.

So erkannte ich, dass ich eine neue Spalte brauchte. Ich nannte es date-added und die neue Bedingung ist date-added < $time-of-first-query für alle nachfolgenden Abfragen. Dann ist der Offset nur die Anzahl der bisher geschriebenen Artikel.

1

Ihre LIMIT sollte etwas wie unten eher sein. Definieren Sie eine $page Variable, die sich von 1 .. no.of pages ändert, die Sie wollen.

LIMIT $offset, $page * $numPerPage 

OK, in diesem Fall müssen Sie Ihr $pages und $numPerPage Variable (auf Refresh) jedes Mal neu berechnen und das Paging entsprechend definieren.

+0

Das mache ich gerade mit verschiedenen Var-Namen – Dotan

+1

Sie müssen Ihre PHP-Seite nach jeder Abfrage aktualisieren. Machst du das wirklich nicht? –

+0

@TimBiegeleisen, das bezweifle ich auch. Für mich fühlt sich Op wahrscheinlich falsch, wie die Paginierung im Allgemeinen funktioniert. – Rahul

Verwandte Themen