Moin!
Vorraussetzungen mysql, php.
Möchte die Anzahl aller Datensätze in einer Tabelle 'tabelle'.
$abfrage='SELECT COUNT(spalte1) FROM tabelle';
$ergebnis=mysql_unbuffered_query($abfrage);Mit SELECT COUNT kann ich doch die Datensätze zählen?
Wenn du SELECT COUNT(*) machst, dann wendet MySQL eine extrem effiziente Abkürzung an, indem aus einer MyISAM-Datentabelle einfach die Anzahl gespeicherter Datensätze ausgelesen wird, ohne alle Datensätze durchzuzählen.
Und mit einem unbuffered Query blaste ich doch das DBMS weniger, oder?
Nein, hier irrst du. Ein mysql_query wird von PHP an die Datenbank geschickt, sofort ausgeführt, und der Ergebnispuffer von MySQL wird von PHP direkt abgefragt, in einen Zwischenspeicher (unter PHP-Verwaltung) geschrieben, und die Datenbank wird dann wieder freigegeben. Dieser PHP-Puffer erlaubt dann u.a. die Anwendung von diversen Funktionen (mysql_num_rows ist eine davon) auf diesen Puffer.
Mit mysql_unbuffered_query wird die Datenbankabfrage auch sofort ausgeführt, allerdings bleiben die abgefragten Daten in einem MySQL-Puffer stehen. PHP ruft nur dann einen neuen Datensatz ab, wenn du mysql_fetch_* benutzt. Funktionen wie mysql_num_rows funktionieren in solch einer Konstellation nicht vernünftig. Außerdem wird der MySQL-Puffer erst freigegeben, wenn du die Verbindung zur Datenbank beendest (z.B. durch Skriptende), oder wenn du über die gleiche Verbindung einen neuen Query schickst. Ein neuer Query zerstört dir das alte Ergebnis, du kannst nicht gleichzeitig zwei unterschiedliche Querys im Puffer halten und wechselseitig mit mysql_fetch_* auslesen! Mit anderen Worten: Wende den unbuffered Query nur dann an, wenn das Resultat der Gesamtabfrage eine so große Datenmenge ergibt, dass diese den verfügbaren PHP-Speicher übersteigt. Dann mußt du jeweils nur einen einzigen Datensatz mit PHP speichern können.
Da dein Query ja aber sowieso nur eine einzige Zahl ermitteln soll, ist deren Datenmenge ziemlich klein. Unbuffered Query ist daher absolut überflüssig.
Doch wie komme ich jetzt an das Ergebnis?
Wie kommst du normalerweise an das Ergebnis einer SELECT-Abfrage (z.B. SELECT name FROM tabelle WHERE irgendwas)? Genauso kommst du an das Ergebnis deiner nur scheinbar "spezieller" aussehenden Abfrage jetzt.
Wo ist mein Denkfehler?
Dein Denkfehler ist, dass du glaubst, allein durch die Abfrage per mysql_query eines COUNT würde an PHP schon irgendein Zahlenwert geliefert. Wird aber nicht. Die Anzahl deiner Datensätze ist Bestandteil eines stinknormalen Datenbankergebnisses. Und jedes Datenbankergebnis wird z.B. mit mysql_fetch_assoc abgefragt, und man erhält dann ein Array mit einem Datensatz. Da "SELECT COUNT(*) FROM tabelle" nur einen einzigen Datensatz produziert, kann man sich eine WHILE-Schleife, die solange abfragt, bis keine Daten mehr verfügbar sind, sparen.
P.S.: geht eigtl auch SELECT COUNT(spalte1) FROM tabelle WHERE spalte1=1?
d.h. ich möchte alle Datensätze der Datenbank zählen, die in spalte1 eine 1 haben...
Das funktioniert auch. Wobei in diesem Fall COUNT(*) keinen extremen Geschwindigkeitsvorteil mehr hat, weil ja gefiltert werden muß.
- Sven Rautenberg
"Love your nation - respect the others."