Wie wird mit der Paginierung von Datenbanken verfahren, wenn eine Zeile dazwischen durch eine Benutzeraktion gelöscht werden kann?

8

Ich stecke in einer Situation fest. Ich hoffe, ich bekomme hier eine Lösung. Ich verwende Paging, um einige Daten auf der Benutzerprofilseite anzuzeigen.

Verwenden Sie dazu einen einfachen Paging-Vorgang:

%Vor%

Seitenklassenkonstruktor:

%Vor%

Wenn nun die Ergebnisse normal angezeigt werden, ohne dass dazwischen etwas gelöscht wird, würde das funktionieren. Ein Benutzer kann jedoch Objekte aus seiner Aktionsliste entfernen.

Lass uns die Situation haben. Angenommen, es gab totalResults - 17, perPage - 6 und totalPages - 3.

Jetzt auf der ersten Seite löscht er 2 Einträge, was zu insgesamt 15 Ergebnissen führt und die Zeilen-ID, die in der 2. Seite sein sollte, wurde auf 9 statt auf 7 verschoben (da zwei Elemente nicht vorhanden sind und das Gesamtergebnis jetzt ist 15).

Ich hoffe, die Situation ist klar. Jetzt ist diese Zwischenschaltung nicht erforderlich.

Ich dachte daran, es als remainingItems zu implementieren, aber ich bin wieder etwas verwirrt. Verbleibende Artikel sind immer abhängig von pageNo und perPage und unabhängig von totalResult (da das Gesamtergebnis zwischenzeitlich verringert wird). Ich kann die letzten n Zeilen auch hier nicht verwenden, da die Zeilenanzahl die Verschiebung meines gewünschten Ergebnisses wieder verringert.

Ich möchte auch nicht zu viele Parameter in der Methode behalten. Zum Beispiel - lassen Sie uns sagen, dass ich die toSatrtWith ID im Parameter übergebe und perPage Anzahl der Zeilen von dort abhole, kann ich die gewünschte Sache bekommen. Aber ich möchte eine elegantere Lösung.

    
Nihal Sharma 26.02.2015, 06:53
quelle

1 Antwort

8

Kurze Antwort: Merken Sie sich "Wo Sie aufgehört haben" anstatt den Standort zu berechnen.

Lange Antwort: Siehe meinen Blog, warum "Paginierung über LIMIT und OFFSET böse ist": Ссылка . (Sie tun das PHP-Äquivalent der Verwendung von LIMIT und OFFSET, also gilt das Blog.)

Die URL für [Weiter] würde id des letzten Elements auf dieser Seite enthalten und dann beim Erstellen der nächsten Seite WHERE id > $id verwenden. (Oder id des ersten Elements von dieser Seite, dann WHERE id >= $id . Dieser geringfügige Unterschied hat eine geringe Auswirkung, wenn eine Zeile zwischen den beiden eingefügt wird.) Habe dies auch in der SQL: ORDER BY id ASC LIMIT 10 . Es werden nur 10 Zeilen abgerufen, unabhängig von welcher Seite. Ohne diesen Trick holen Sie alle Zeilen für alle Seiten vor der aktuellen ab.

[Vorherige] Seite ist ähnlich, aber mit einem Flag, das sagt, rückwärts zu gehen ( ORDER BY id DESC LIMIT 10 ).

[Zuerst] ist wahrscheinlich am besten, indem Sie id nicht angeben; dann sagt der Code "Oh, ich sollte die erste Seite bauen."

[Last] könnte ein Flag für Last oder id=-1 oder was auch immer enthalten - dann verwende etwas wie ORDER BY id DESC LIMIT 10 in der SQL.

Ohne diese Technik führt eine Zeile, die vor der aktuellen Seite gelöscht oder eingefügt wird, dazu, dass die Liste um ein Element verschoben wird (vorwärts oder rückwärts). Daher verfehlt der Benutzer eine Zeile oder eine Zeile wird dupliziert (nur nervig).

    
Rick James 26.02.2015, 08:14
quelle

Tags und Links