Archive for June 28th, 2006

28
Jun

SELECT FOUND_ROWS();

Als mir jemand von SQL_CALC_FOUND_ROWS erzählte - ich glaube es war Darren -, dachte ich, ein SELECT COUNT(*) wäre kein Unterschied. Heute habe ich einen Verwendungszweck gefunden.

Ich arbeite zur Zeit an einer möglichst generischen Grundlage - ich möchte es nicht Framework nennen - für weitere Entwicklungen. In den ORM Objekten, die den Zugriff auf Tabellen ermöglichen, erzeuge ich dynamisch einen Join, um verschachtelte Objekte mit möglichst wenig “Kosten” zu erzeugen. Für die Spaltenbezeichnung benötige ich Aliase.

Die Funktion, die eine ganze Liste dieser Objekte erzeugt, kann natürlich gefiltert werden. Sobald ich nach einem Alias filtere, kann ich WHERE nicht verwenden und muss das kostenintensivere HAVING verwenden.

Mit SQL_CALC_FOUND_ROWS veranlasse ich mySQL dazu, die Gesamtanzahl der Treffer - ohne LIMIT - zu ermitteln. Die Anzahl der Treffer kann im Anschluss mit SELECT FOUND_ROWS(); ausgelesen werden.

mysql> SELECT SQL_CALC_FOUND_ROWS col1, col2, col3 AS foo FROM table HAVING foo = 'bar';
+------+------+-----+
| col1 | col2 | foo |
+------+------+-----+
| ...  | ...  | ... |

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|        28123 |
+--------------+
1 row in set (0.00 sec)

Wesentlich einfacher, als dynamisch Queries mit Aliasen und Joins umzuschreiben.

Danke für den Tipp :)