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).
- 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.
- SELECT SQL_CALC_FOUND_ROWS
- spalte1,
- spalte2
- FROM tabelle
- WHERE feld = 'suchwort'
- 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.
- 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.
PHP-Beispiel:
- SELECT SQL_CALC_FOUND_ROWS
- feld1,
- feld2,
- feld3
- FROM tabelle
- WHERE feld1 LIKE 'suchwort'
- LIMIT 0, 10
- ");
- {
- echo "$feld1 $feld2 $feld3\n";
- }
-
-
- echo "Datensätze insgesamt: $cnt";
2 Kommentare
Other Links to this Post
RSS Feed für Kommentare zu diesem Artikel. TrackBack URI



By Pete-Bremen, 17. Januar 2010 @ 22:45
und wie kann ich meine Ausgabe auf den zuletzt eingegebenen Datensatz beschränken ?
By Der Typ, 18. Januar 2010 @ 23:02
Durch das Einfügen des Datensatzes entsteht in der Regel die Möglichkeit, die ID des zuletzt eingefügten Datensatzes zu ermitteln. Abhängig von der Programmiersprache kann die ID recht einfach bezogen werden (zum Beispiel in PHP mit mysql_insert_id()). Mit MySQL Hausmitteln ist dazu die Funktion last_insert_id() zu verwenden. Voraussetzung dafür ist die Existenz einer AUTOINCREMENT-Spalte in der betroffenen Tabelle.
Mit dieser ID, kann der DS anschließend einfach abgefragt werden: SELECT * FROM tabelle WHERE id = ID