Anzahl betroffener Datensätze unter Verwendung von Limit ermitteln (MySQL)

Sicherlich standet ihr auch schon einmal vor dem Problem, die Ergebnismenge einer SQL Abfrage einschränken zu müssen. Soweit ist alles unkritisch. Wird nun beispielsweise für eine Seitenauswahl (pagination 1, 2, 3, … etc.) die Gesamtanzahl der Datensätze benötigt, ist eine weitere Abfrage erforderlich, welche ohne Limit die Ergebnisse zählt (COUNT).

SQL   
  1. SELECT COUNT(*) FROM tabelle WHERE feld = 'suchwort'

Bei einfachen Abfragen ist diese Art des “countens” von Datensätzen kein Problem. Sind die Abfragen jedoch komplexer, so ist zum Zählen von Datensätzen die SQL Abfrage doch sehr oft um zu formulieren.

Die Lösung des Problems bietet MySQL selbst mit dem Befehl SQL_CALC_FOUND_ROWS.

SQL   
  1. SELECT SQL_CALC_FOUND_ROWS
  2. spalte1,
  3. spalte2
  4. FROM tabelle
  5. WHERE feld = 'suchwort'
  6. LIMIT 0, 10

SQL_CALC_FOUND_ROWS wird einfach vor die zu selektierenden Spalten gesetzt (Achtung ohne Komma) und wirkt sich abgesehen von der minimal schlechteren Performance zunächst nicht aus. Das Resultset besteht aus maximal 10 Datensätzen und  kann wie gehabt gefetcht werden. Durch eine weitere SQL Abfrage mit dem Befehl FOUND_ROWS wird anschließend die Anzahl aller gefundenen Datensätze ohne die Limitierung abgefragt.
SQL   
  1. SELECT FOUND_ROWS()

Diese Abfrage gibt genau einen Record (Datensatz) mit einem Tupel zurück und enthält die Anzahl gefundener Datensätze ohne Limitierung. Neben des Vorteils, dass die Abfrage nicht für das Zählen der Einträge umgeschrieben werden muss, ergibt sich oftmals jedoch ein minimaler Performancenachteil. Hier gilt es zwischen Komfort und Performance abzuwägen.

Mehr Informationen über SQL_CALC_FOUND_ROWS und FOUND_ROWS findet ihr in der offiziellen MySQL-Dokumentation.

Ein PHP Beispiel findet ihr im kompletten Beitrag. Read more »

Tags:

categories SQL