2012-10-14 17 views
52

Mögliche Duplizieren:
Find total number of results in mySQL query with offset+limitGesamtanzahl der Zeilen bei Verwendung von LIMIT?

Ich habe eine sehr komplexe SQL-Abfrage, die Ergebnisse zurückgibt, die paginierte sind. Das Problem besteht darin, die Gesamtzahl der Zeilen vor LIMIT zu bekommen. Ich muss die SQL-Abfrage zweimal ausführen. Das erste Mal ohne die Limit-Klausel, um die Gesamtzahl der Zeilen zu erhalten. Die SQL-Abfrage ist wirklich komplex und ich denke, dass sie eine bessere Möglichkeit sein muss, dies zu tun, ohne die Abfrage zweimal auszuführen.

+10

Sie erhalten bald den Hinweis, 'SQL_CALC_FOUND_ROWS' zu verwenden, aber die Sache ist, dass' COUNT (*) 'mit den gleichen Bedingungen effizienter ist – zerkms

+0

Haben Sie dies überprüft: http://stackoverflow.com/ Fragen/2229218/Was-ist-Mysql-Version-of-rowcount – jtheman

+1

Werfen Sie einen Blick auf diese: http://stackoverflow.com/questions/5928611/find-total-number-of-results-in-mysql-query- with-offsetlimit –

Antwort

71

Zum Glück seit MySQL 4.0.0 können Sie die Option SQL_CALC_FOUND_ROWS in Ihrer Abfrage verwenden, die MySQL anweist, die Gesamtzahl der Zeilen ohne Berücksichtigung der LIMIT-Klausel zu zählen. Sie müssen noch eine zweite Abfrage ausführen, um die Anzahl der Zeilen abzurufen, aber es ist eine einfache Abfrage und nicht so komplex wie Ihre Abfrage, die die Daten abgerufen hat. Die Nutzung ist ziemlich einfach. In Ihrer Hauptabfrage müssen Sie die Option SQL_CALC_FOUND_ROWS direkt nach SELECT hinzufügen, und in der zweiten Abfrage müssen Sie die Funktion FOUND_ROWS() verwenden, um die Gesamtanzahl der Zeilen zu erhalten. Abfragen würden wie folgt aussehen:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10; 

SELECT FOUND_ROWS(); 

Die einzige Einschränkung ist, dass Sie zweite Abfrage unmittelbar nach dem ersten Anruf muss, weil SQL_CALC_FOUND_ROWS Anzahl der Zeilen nicht überall speichern. Obwohl diese Lösung auch zwei Abfragen erfordert, ist sie wesentlich schneller, da Sie die Hauptabfrage nur einmal ausführen. Sie können mehr über SQL_CALC_FOUND_ROWS and FOUND_ROWS() in MySQL-Dokumentation lesen.

EDIT: Sie sollten beachten, dass in den meisten Fällen das Ausführen der Abfrage zweimal schneller ist als SQL_CALC_FOUND_ROWS. siehe here

+2

SQL_CALC_FOUND_ROWS ist langsamer als andere Abfrage ohne Limit laufen, wie ich verstanden: http://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ Plus-es tut funktioniert nicht in Unterabfragen –

+5

Dies ist die tollste Sache, die ich je gesehen habe. –

+1

SQL_CALC_FOUND_ROWS ist in meinem Fall definitiv ** nicht ** langsamer, was eine etwas komplexe Abfrage ist, die zwischen 2 und 10 Sekunden dauert. Das ist sehr hilfreich, danke! – billynoah

Verwandte Themen