Frage

Ich hoffe, ich bin nicht ein Duplikat zu schreiben, aber ich habe nichts gefunden, dass meine Frage beantwortet. (Obwohl es mir scheint ziemlich weit verbreitetes Problem zu sein.)

Das Problem tritt fast jedes Web-Projekt in: Sie haben eine Tabelle mit vielen vielen Einträgen und wollen, dass sie auf einzelnen Seiten angezeigt werden.

Jetzt frage ich mich, was ist der beste Weg, um die Anzahl der Seiten für einen bestimmten Satz von Tabellenzeilen erforderlich zu berechnen.

Hier einige Ansätze, die ich habe von nachgedacht. Ich möchte einige Antwort bekommen, wie effektiv sie sind. Ich werde PHP-spezifische Beispiele geben, aber ich wette, es gibt ähnliche Techniken in anderen Sprachen.

  1. Der wahrscheinlich beste Weg ist, die Anzahl der Seiten statisch zu speichern und den Wert jedes Mal ein neuer Eintrag ändern wird hinzugefügt. (Trotzdem ... Ich suche nach einer dynamischen Lösung :-))

  2. Starten Sie eine SELECT COUNT(*) über die Zeilen von Interesse und berechnet Zahl, die der Seite jedes Mal, wenn die Seite angezeigt wird.

  3. Starten Sie ein gewöhnliches wählt eine Ergebnismenge für alle Zeilen zu erhalten. Nun lädt nicht die Zeilen von mysql_fetch_row Aufruf oder so, aber die Anzahl der Zeilen mit mysql_num_rows bekommen. (Da ich keine Ahnung, wie dies umgesetzt wird, kann ich nicht sagen, ob es wirksam ist oder nicht. Wer weiß?) Dann kann ich bequem das Ergebnis gesetzt Zeiger bewegen. (Für mysqli gibt es mysql_data_seek, aber die native MySQL-Erweiterung hat keine ähnliche Funktion. Daher gehe ich davon aus, dass dies nur einige Pufferung Verhalten von mysqli)

Kann mir jemand sagen, wie die Anzahl der Zeilen (Anzahl der Seiten) zu zählen, am effektivsten?

War es hilfreich?

Lösung

Nummer 2 ist das häufigste Muster

select count(*) from [Table] where [Expressions]

Und dann

select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize]

Das gibt Ihnen die gesamten Zeilen für die gesamte Ergebnismenge, sondern nur die Daten der Zeilen für die aktuelle Seite.

Viele Frameworks oder CMSes haben Konventionen für das Caching bestimmte Teile dieser Daten in der Sitzung, die Sie kann oder auch nicht-abhängig machen wollen auf Ihnen Tischgrößen erwartet, eine Volatilität von Daten, etc.

Andere Tipps

Wenn Sie wirklich etwas von truely WTF Proportionen wollten, könnten Sie immer verfolgen, wie viele Zeilen waren durch einige Register inkrementieren einen Trigger für Insert mit / löschen.

Aber ich denke, das ist eine Antwort für noch mehr Fragen zu stellen;).

Just SELECT COUNT verwenden, wenn Sie zu haben. Wenn es langsam, das bedeutet, dass Ihre Datenbank falsch in der Regel gebaut wird.

Auch habe ich das Gefühl es vorzeitige Optimierung ist hier kriecht. Nicht vorzeitig optimieren. Machen Sie es Sinn machen, und dann macht es sinnvoll, besser machen. Sinn ergeben?

Wenn ich in den meisten Systemen richtig verstehen habe ich gearbeitet habe, ich die Anzahl der Seiten in der gleichen Zeit gebraucht habe, wie ich einen neuen Satz von Zeilen für eine Seite bin Grabbing. Dies ermöglicht eine Anzeige von „Seite N von M“ oder so ähnlich, wie der Titel, und einem Bildschirm voll von Einträgen.

Es ist die Datenbank abhängig ist, aber in der Regel übergeben Sie in der current_page Nummer (oder Zeilennummer), dann eine „limited Abfrage“ (FETCHSIZE, oben, etc.) die nächste Gruppe von Zeilen und eine Gesamtseitenzahl zu erhalten. Zugegeben, es wird hässlich, wenn die Anzahl der Zeilen unterhalb ändern, aber ich keine Sorge in der Regel nicht darüber.

Paul.

Ich glaube, Sie möchten, dass Ihre Navigation um eine einzelne SQL-Abfrage erstellen, die nur die LIMIT Schlüsselwort ändert. Zum Beispiel SELECT * FROM myTable LIMIT 0,20 werden die ersten 20 Zeilen zurück. In PHP-Skript für Seite 2 Sie werden dann die SQL-Abfrage gesetzt SELECT * FROM myTable LIMIT sein 20,40 somit Rückkehr Zeilen 20 bis 40. Ist das, was Sie suchen?

Die Navigation kann durch einfache dabei eine SELECT COUNT (*) / rowsPerPage und damit Looping eines Struktur-Code mit Ihrem PHP-Skript erstellt werden, bis die Gesamtzahl der Zeilen entsprechen. Das Ende Abfrage würde dann LIMIT zu lastLimit, TotalRowCount.

Edit: berechnen, wie viele Seiten Sie alle Zeilen berechnen müssen Sie müßten definieren, wie viele Zeilen 1 Seite haben kann. Sie würden dann tun totalRows / MaxPerPage = howManyPagesNeeded

2 Fragen in diesem Zusammenhang zu berücksichtigen:

  • , wie die Daten zu verarbeiten, die aktualisiert wird / eingeführt, während Sie sehen gerade?
  • , wie viele gleichzeitige Benutzer die Daten werden gerade und wird die Anwendung in der Lage sein, mit dem Verkehr zu halten, wenn es holt Datenseiten dynamisch?

Abhängig von den Antworten, hier einige der anderen Antworten können oder nicht anwenden.

Sie möchten vielleicht a href überprüfen <= "https://stackoverflow.com/questions/168084/is-there-a-more-efficient-way-of-making-pagination-in-hibernate-than- Ausführen-se "> dieser Frage ist, ist es sehr ähnlich, was Sie fragen.

Eine gute Möglichkeit, dies zu tun zu verwenden ist SQL_CALC_FOUND_ROWS

Beispiel:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

Auch wenn Sie die Abfrage 10 Ergebnisse sind zu begrenzen, wird die zweite Abfrage, um die tatsächlichen Gesamt Zeilen zurück, die zurückgegeben worden wären Sie ein Limit nicht verwendet.

Es ist wichtig, dass FOUND_ROWS() zu beachten, zuverlässig, nicht, wenn die MySQL-Datenbankreplikation mit

Eigentlich, wenn Sie eine Webseite mit PHP sind füllen, dann ist es einfacher, nur die MySQL-Tabelle zu erhalten, um die Daten in ein Array stellen und eine for-Schleife verwenden throught die Daten wie folgt zu gehen

for($i=0;$i<count($arrayvar);$i++){}

Mit noch einem einfachen Template-Engine, einen Block in einem anderen Block deklariert und analysiert all Daten in einer consequtive Linie.

Hoffnung, dass die Art der Antwort ist für Sie suchen. Ich bin nicht wirklich klar, was Sie durch Ihre Frage bedeuten, aber ich denke, das ist es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top