Gefundene Einträge zählen mittels COUNT
Es kann vorkommen, dass ihr die Anzahl der Datenbankeinträge zählen möcht, beispielsweise um die Anzahl an Produkten die ihr in einem Online-Shop habt auszugeben. Dafür gibt es tendenziell zwei Möglichkeiten: Eine Möglichkeit direkt in PHP mittels der Methode $statement->rowCount() oder mittels dem SQL-Befehl COUNT ,
Inhaltsverzeichnis
Einträge zählen mittels rowCount()
Möchtet ihr die Anzahl der Datensätze zählen die eine gewisses Query geliefert hat, so könnt ihr die PDO-Methode $statement->rowCount() verwenden:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT * FROM users WHERE vorname = ?"); $statement->execute(array('Max')); $anzahl_user = $statement->rowCount(); echo "Es wurden $anzahl_user Benutzer gefunden"; ?>
Dies funktioniert nicht nur für SELECT-Anweisungen, sondern auch für UPDATE- und DELETE-Anweisungen:
1 2 3 4 5 6 7 8 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("DELETE FROM users WHERE vorname = ?"); $statement->execute(array('Max')); $anzahl_user = $statement->rowCount(); echo "Es wurden $anzahl_user Benutzer gelöscht"; ?> |
Hinweis: Die PDO-Methode rowCount() wird in PHP ausgeführt. Wenn ihr also nach einer SELECT-Anweisung das rowCount() durchführt, dann wurden zuerst alle Daten von der Datenbank an PHP gesendet und dort werden die Datensätze gezählt. Angenommen ihr habt ein Forum mit 100.000 Posts und ihr wollt die Anzahl der Posts zählen, dann würde mit dieser Variante alle 100.000 Posts ausgelesen werden, von der Datenbank an PHP gesendet werden und dort gezählt werden. Dies ist natürlich extremst langsam. Deswegen solltet ihr diese Variante nur nutzen, wenn ihr vorhabt die Daten auch auszugeben. Ansonsten verwendet lieber den SQL-Befehl COUNT(), denn dort zählt MySQL die Anzahl der Datensätze.
Einträge zählen mittels COUNT()
Um das zuvor beschriebene Problem mit großen Datentabellen zu umgehen existiert der SQL-Befehl COUNT . Mit diesem weist ihr die MySQL-Datenbank an, die Datensätze eurer Tabelle zu zählen und es wird nur das Ergebnis zurückgeliefert. Dies verursacht natürlich deutlich weniger Traffic zwischen dem MySQL-Server und dem Webserver, wenn statt dem Inhalt aller 100.000 Posts nur die Zahl 100.000 übergeben wird. Ebenfalls kann MySQL in vielen Fällen deutlich effizienter die Anzahl der Datensätze bestimmten, und zwar wenn Indices genutzt werden (mehr dazu im Artikel Optimierung von MySQL: Verwendung des Index).
Um die Gesamtanzahl der Datensätze zu bekommen könnt ihr folgenden SQL-Anweisung ausführen:
1 |
SELECT COUNT(*) AS anzahl FROM users |
In PHP und PDO eingebettet sieht dies dann wie folgt aus:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM users"); $statement->execute(); $row = $statement->fetch(); echo "Es wurden ".$row['anzahl']." User gefunden"; ?>
Zuerst bereiten wir unsere Anfrage mittels Prepared Statements vor. Eine Neuheit bei dem SQL-Query is die Verwendung des Befehls AS. Damit benennen wir das Ergebnis der COUNT(*)-Operation um in den Namen anzahl. Im weiteren Code können wir dann auf anzahl ganz gewöhnlich zugreifen wie auf andere Spalten auch. Danach wird der Befehl mittels execute() ausgeführt und mittels fetch() holen wir uns das Ergebnis zurück. Danach können wir die Anzahl ausgeben.
Natürlich können wir auch beliebige WHERE-Argumente nutzen, um unsere Query einzuschränken. Um die Anzahl der User die 'Max' heißen herauszufinden kann man folgenden Code nutzen:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM users WHERE vorname = ?"); $statement->execute(array('Max')); $row = $statement->fetch(); echo "Es wurden ".$row['anzahl']." User gefunden"; ?>
Anzahl eindeutiger Einträge
Mittels dem DISTINCT Befehl können wie in Komplexere Datenabfrage per SELECT beschrieben doppelte Einträge vermieden werden. Möchtet ihr also herausfinden wie viele unterschiedliche Vornamen in eurer User-Tabelle vorkommen, so sieht der passende SQL-Befehl dazu wie folgt aus:
1 |
SELECT COUNT(DISTINCT vorname) AS anzahl FROM user |
Ihr könnt auch mehrere Spalten angeben. MySQL Filter dann nur die Zeilen raus, bei denen alle Spalten gleich sind. Der folgende SQL-Query liefert z.B. die Anzahl der unterschiedlichen Vor- und Nachnamen in eurer Tabelle:
1 |
SELECT COUNT(DISTINCT vorname, nachname) AS anzahl FROM user |
Max Mustermann und Petra Mustermann würden hier als zwei verschiedene Einträge gezählt werden.
Einträge nach Kriterien gruppieren
Mittels GROUP BY können wir unseren COUNT-Befehl nach gewissen Kriterien sortieren, z.B. die häufigsten Nachnamen herauszufinden:
1 |
SELECT nachname, COUNT(*) AS anzahl FROM users GROUP BY nachname |
Hier geben wir die Spalte nachname und die Anzahl aus, dabei wird nach der der Spalte nachname gruppiert. D.h. am Ende erhalten wie einen Überblick mit der Anzahl der Benutzer mit dem gleichen Nachnamen.
In PHP mit PDO sieht das ganze wie folgt aus:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT nachname, COUNT(*) AS anzahl FROM users GROUP BY nachname ORDER BY anzahl DESC"); $statement->execute(); while($row = $statement->fetch()) { echo $row['nachname'].": ".$row['anzahl']." User<br />"; } ?>
Natürlich lässt sich dies auch mit WHERE verbinden, wenn wir z.B. nur gewisse Einträge zählen möchte. Folgender SQL-Query zählt die Benutzer gruppiert nach nachname für die Personen die Max mit Vorname heißen:
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT nachname, COUNT(*) AS anzahl FROM users WHERE vorname = ? GROUP BY nachname"); $statement->execute(array('Max')); while($row = $statement->fetch()) { echo $row['nachname'].": ".$row['anzahl']." User<br />"; } ?>
Die GROUP BY-Anweisung ist praktisch, wenn ihr schnell Statistiken zu eurer Tabelle erstellen wollt, beispielsweise eine Statistik der Anzahl der neuen Nutzer pro Monat.
Autor: Nils Reimers