HOWTO · MySQL
MySQL-Zeilen mit SQL-COUNT() über PHP MySQLi zählen
Zählen Sie MySQL-Zeilen mit SQL-COUNT()-Abfragen, die Sie über PHP MySQLi ausführen. Erfahren Sie, wann COUNT(*) oder COUNT(column) geeignet ist und wie Sie das Ergebnis abrufen.
Auf dieser Seite
Um Zeilen in MySQL mit PHP zu zählen, führen Sie über die MySQLi-Erweiterung eine SQL-Aggregatabfrage aus. COUNT() ist eine SQL-Funktion; MySQLi stellt Methoden für Verbindungen und Ergebnisse bereit, aber keine count()-Funktion zum Zählen von Datenbankzeilen. Mit COUNT(*) zählen Sie jede Zeile, mit COUNT(column) nur Zeilen, in denen die betreffende Spalte nicht NULL ist. Mit WHERE filtern Sie Zeilen, und mit GROUP BY erhalten Sie eine Anzahl je Gruppe.
Die Beispiele verwenden für Zeilenzählungen die Tabelle employees und für Statusbeispiele die Tabelle users. Ersetzen Sie diese Tabellen- und Spaltennamen durch die Bezeichnungen in Ihrem Schema. Das Manager-Beispiel umfasst fünf Werte: einen Wert NULL und vier Werte ungleich NULL. So wird deutlich, warum die beiden Aggregatformen unterschiedliche Ergebnisse liefern können.
Alle Zeilen mit COUNT(*) zählen
Verwenden Sie COUNT(*), wenn jede passende Zeile zur Summe beitragen soll, auch wenn andere Spalten dieser Zeilen NULL enthalten. Die Abfrage SELECT COUNT(*) AS total FROM employees gibt beispielsweise eine Zeile mit der Anzahl der Datensätze in employees zurück. Das Ergebnis ist ein einzelner Aggregatwert. Er eignet sich etwa als Gesamtzahl der Datensätze, anhand derer sich die Zahl der Seiten für eine Seitennavigation berechnen lässt. Das Zählen ruft die Mitarbeiterdatensätze nicht selbst ab und beschleunigt auch keine separate Abfrage für eine Seite. Es liefert lediglich die Gesamtzahl, die die Anwendungslogik verwenden kann.
Das * steht hier für alle Zeilen, die in das Aggregat eingehen. Es bedeutet nicht, dass MySQL jede Spalte zurückgibt. Wenn Sie eine Bedingung benötigen, fügen Sie vor dem Zählen eine WHERE-Klausel hinzu. Der folgende Abschnitt zeigt dieses Muster.
Werte ungleich NULL mit COUNT(column) zählen
Verwenden Sie COUNT(column), um Zeilen zu zählen, in denen die angegebene Spalte einen anderen Wert als NULL enthält. Alle Zeilen werden nur dann gezählt, wenn diese Spalte in jeder Zeile befüllt ist. In diesem Beispiel lauten die Werte von managerid NULL, 1, 1, 3 und 2: COUNT(*) erfasst fünf Zeilen, während COUNT(managerid) vier Werte zählt. Das ist nützlich, wenn Sie wissen möchten, wie viele Mitarbeiter eine Führungskraft zugewiesen haben, statt wie viele Mitarbeiter insgesamt vorhanden sind.
Führen Sie dieses Beispiel aus. Die Bezeichnungen in der Ausgabe des Codebeispiels bleiben auf Englisch.
<?php
$managerIds = [null, 1, 1, 3, 2];
$rowCount = count($managerIds);
$managerCount = count(array_filter($managerIds, function ($value) {
return $value !== null;
}));
printf("COUNT(*): %d\nCOUNT(managerid): %d\n", $rowCount, $managerCount);
Die entsprechende Datenbankabfrage lautet SELECT COUNT(managerid) AS assigned_managers FROM employees. Verwenden Sie in der Abfrage und in der Erklärung den tatsächlichen Spaltennamen. Das Zählen einer anderen Spalte kann eine andere Summe ergeben, weil COUNT(column) die Werte NULL dieser Spalte ignoriert.
Zeilen zählen, die einer Bedingung entsprechen
Geben Sie die Bedingung in WHERE an, um festzulegen, welche Zeilen in das Aggregat eingehen. Die Abfrage SELECT COUNT(*) AS total FROM users WHERE status = 'active' zählt beispielsweise Benutzer, deren Status active entspricht. Sie zählt nicht zunächst alle Benutzer und filtert danach das einzelne Aggregatergebnis. Der Textvergleich richtet sich nach den Kollationsregeln der Spalte. Ob Groß- und Kleinschreibung unterschieden werden, hängt daher vom Schema und der Kollation ab.
Wenn die Bedingung von einem Wert aus einer PHP-Anfrage abhängt, verwenden Sie eine vorbereitete Anweisung, statt den Wert an die SQL-Abfrage anzuhängen. Das SQL-Muster lautet SELECT COUNT(*) AS total FROM users WHERE status = ?. Binden Sie den Statuswert mit MySQLi, führen Sie die Anweisung aus und rufen Sie die einzelne Ergebniszeile ab. So bleibt die Bedingung eindeutig, und Benutzereingaben werden nicht als Bestandteil der SQL-Anweisung behandelt.
Gruppierte Anzahlen mit GROUP BY
Verwenden Sie GROUP BY, wenn Sie für jede unterschiedliche Gruppe eine Anzahl benötigen, etwa für aktive und inaktive Benutzer. Die Abfrage SELECT status, COUNT(*) AS total FROM users GROUP BY status gibt für jeden Statuswert eine Ergebniszeile zurück. Jede Anzahl umfasst alle Zeilen der jeweiligen Gruppe. Kann status selbst den Wert NULL haben, bilden diese Zeilen eine Gruppe mit dem Wert NULL; COUNT(*) schließt sie nicht stillschweigend aus.
Fügen Sie ORDER BY status hinzu, wenn die Ausgabe in einer festen Reihenfolge erscheinen soll. Ohne diese Klausel garantiert SQL keine bestimmte Reihenfolge der Gruppen. Um nur ausgewählte Gruppen zu zählen, kombinieren Sie WHERE mit GROUP BY, zum Beispiel WHERE created_at >= ? GROUP BY status. Der Filter wird angewendet, bevor die Zeilen gruppiert und gezählt werden.
Ein COUNT()-Ergebnis mit PHP MySQLi abrufen
Eine COUNT()-Abfrage gibt eine Zeile mit einer benannten Aggregatspalte zurück. Führen Sie die Abfrage mit MySQLi aus, rufen Sie diese Zeile ab und lesen Sie den Alias aus, der nach AS angegeben ist. Das folgende eigenständige Skript liest Verbindungseinstellungen aus Umgebungsvariablen und fragt die Tabelle users ab. Es benötigt die MySQLi-Erweiterung und eine erreichbare MySQL-Datenbank mit dieser Tabelle. Solange Sie diese Einstellungen nicht konfigurieren, lässt sich für dieses datenbankgestützte Beispiel kein Datenbankergebnis angeben. Die Bezeichnungen und Ausgaben im Codebeispiel bleiben auf Englisch.
<?php
if (!class_exists('mysqli')) {
fwrite(STDOUT, "Enable the MySQLi extension to run this query.\n");
} else {
$host = getenv('DB_HOST') ?: '';
if ($host === '') {
fwrite(STDOUT, "Set DB_HOST, DB_USER, DB_PASSWORD, and DB_NAME.\n");
} else {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$db = new mysqli(
$host,
getenv('DB_USER') ?: '',
getenv('DB_PASSWORD') ?: '',
getenv('DB_NAME') ?: ''
);
$result = $db->query('SELECT COUNT(*) AS total FROM users');
$row = $result->fetch_assoc();
printf("Total users: %d\n", (int) $row['total']);
$result->free();
$db->close();
} catch (Throwable $error) {
fwrite(STDOUT, "Database query unavailable: " . $error->getMessage() . "\n");
}
}
}
Da die Abfrage eine einzelne Zeile zurückgibt, genügt fetch_assoc(); eine Schleife ist nicht erforderlich. Der Alias total ist der Schlüssel im assoziativen Array. Wandeln Sie den abgerufenen Wert in eine Ganzzahl um, wenn Ihre Anwendung eine Ganzzahl benötigt, und behandeln Sie Verbindungs- oder Abfragefehler im Produktivcode gemäß der Fehlerbehandlungsrichtlinie Ihrer Anwendung. Wenn die Anzahl von einer Benutzereingabe abhängt, bereiten Sie die Bedingung wie oben beschrieben vor und binden Sie den Wert, statt ihn in die Abfragezeichenfolge einzufügen.