Ich habe ein klassisches Paginierungssystem, das LIMIT startrecord, endrecord
verwendet, und ich möchte herausfinden, in welcher Seitennummer ein X-Eintrag gespeichert ist.
Die einzige Idee, die ich gerade habe, ist rekursiv alle Datensätze zu suchen, um es herauszufinden. Aber ich suche nach einer viel "ökonomischeren" Methode!
Irgendwelche Ideen?
Sie können eine Unterabfrage verwenden, um eine Tabelle mit den Ergebnissen und ihrer Position zu erstellen, und dann die Abfrage für den bestimmten Eintrag, den Sie gerade betrachten, abfragen:
%Vor%Die zurückgegebene Tabelle zeigt den Datensatz und den Rang an, der in der ursprünglichen Abfrage angezeigt wurde. Sie können den Rang durch die Anzahl der Ergebnisse pro Seite teilen ... Oder bauen Sie ihn in die Abfrage ein. Hoffe, das hilft.
Verringern Sie die Anzahl der Datensätze, die vor dem gesuchten Datensatz liegen. Dies erfordert, dass Sie einen Auftrag für Ihre Anfrage übernehmen, was natürlich ist.
%Vor% Dann rufen Sie einfach c
ab und berechnen ceilling(c/page_size)
. Dadurch erhalten Sie die Seitenzahl, in die Ihr Datensatz fallen wird. Die einzige wichtige Sache, die Sie beachten sollten, ist, dass Sie die Datensätze in derselben Reihenfolge sortieren müssen, wie Sie dies in Ihrer Abfrage mit Limit tun würden.
Um zu beschreiben, was die Abfrage tut, zählt sie die Anzahl Datensätze, die vor dem Datensatz mit der ID 18 stehen. Der einzige schwierige Teil ist mit Datensätzen mit demselben Wert wie für ihre sort_field
, in der MySQL den Primärschlüssel verwendet und in unserem Fall die id
. Und deshalb haben wir den OR
-Teil in unserem Zustand. In meiner Antwort gehe ich davon aus, dass Sie Ihre ursprüngliche Abfrage (mit limit-Anweisung) aufsteigend sortieren, aber wenn Sie absteigend sortieren, müssen Sie alle <
in >
ändern.
Verwenden Sie so etwas wie Ihre Abfrage als Teil des% sub_elect
und teilen Sie die Zeile nach der Seitengröße von Ihrer Seitennummerierung. Konkretes aber unsinniges Beispiel:
%Vor% Wie beabsichtigt, ändert sich der Wert von s
mit der Reihenfolge, die Sie im subselect verwenden.
Es faltet die Variableninitialisierung in die Abfrage, so dass dies nur eine Anweisung ist. Es hängt auch nicht von einer natürlichen Reihenfolge oder Verteilung von Zeilen ab - solange die Reihenfolge, in der sie zurückgegeben werden, für jede von Ihnen angegebene ORDER die gleiche bleibt (oder auslassen).
Wenn dies etwas ist, das Sie oft verwenden werden, ist es eine gute Idee, ein gespeicherte Prozedur oder eine Funktion . Wir können einen Cursor darin verwenden, um die Ergebnisse zu durchlaufen und die Position des zu erhalten gewünschter Artikel. Ich denke, das wird schneller sein, es muss nicht zu allen Aufzeichnungen iterieren, und brauche keine Unterabfrage (für all das würde ich sagen, dass es wirtschaftlicher ist) und Sie können Ordnung, Beitritt und was immer Sie brauchen verwenden.
%Vor%Sie erstellen die Funktion nur einmal, und für die Verwendung müssen Sie nur diese Funktion verwenden:
%Vor%und gibt die Position des Elements in der Position [0] [0] des zurückgegebenen Rowsets zurück.
Natürlich können Sie anstelle der ID auch eine Funktion erstellen, die den Namen oder ein anderes Feld oder sogar mehr als eins vergleicht.
Wenn die Abfrage immer anders ist , können Sie keine Funktion verwenden, aber Sie können den Cursor weiterhin verwenden (die Syntax ist identisch). Sie können den Cursor in Ihrem PHP erstellen, lassen Sie pos
eine Systemvariable sein (mit @pos), und fügen Sie in jedem Fall nur die spezifische SQL der Abfrage hinzu (der Teil zwischen DECLARE pos_cursor CURSOR FOR
und --end of query
)
Sie können nicht wirklich einen "wirtschaftlichen" Weg schaffen. Sie müssen die vollständige Liste der Datensätze aus der DB abrufen, da es keine Möglichkeit gibt, die Position eines Datensatzes von MySQL zu erfahren.
Abhängig von Ihrer Sortierung, der Häufigkeit, mit der sich die Daten ändern, können Sie dem Datensatz seine Position in einer Spalte zuweisen: Fügen Sie die Spaltenposition zu der Tabelle hinzu, die Sie abfragen. Das ist möglicherweise nicht in allen Fällen machbar.
Tags und Links php mysql pagination seek