[SQL] COUNT(*) zusammen mit anderen Spalten in einer SELECT-Abfrage

Zweipunktnull

Commander
Registriert
Dez. 2004
Beiträge
2.546
So, jetzt schmeiße ich direkt noch einen Thread hinterher.
Ich hab's nicht in den alten geschrieben, da ich ein bisschen Angst hatte, dass da niemand reinguckt, weil die meisten mit PDO wohl noch eher wenig Erfahrung gesammelt haben.

Es geht darum, dass ich versuche, in einer SELECT-Abfrage COUNT(*) und weitere Spalten gleichzeitig abzufragen, was auch eigentlich möglich ist, nur bei mir nicht funktionieren möchte.
Na ja, ich weiß noch nicht, ob das Problem richtig rüberkam, aber hoffentlich sprechen ein paar Zeilen Code mehr als 1000 Worte... ;)

(Im Code wird zwar PDO verwendet, aber eigentlich muss man von PDO keine Ahnung haben. Es geht primär um die SQL-Abfragen... ;) )


PHP:
// nur COUNT(*) wird "selectet", Abfrage funktioniert
$sql  = "SELECT COUNT(*)
         FROM `users`
         WHERE `user` = '$user' && `password` = '$password'";
$stmt = $db->prepare($sql);
$stmt->execute();
echo $stmt->fetchColumn();




// nur `id` wird "selectet", Abfrage funktioniert
$sql  = "SELECT `id`
         FROM `users`
         WHERE `user` = '$user' && `password` = '$password'";
$stmt = $db->prepare($sql);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['id'];




// es wird versucht, COUNT(*) und `id` zu "selecten", Abfrage funktioniert nicht
$sql  = "SELECT COUNT(*), `id`
         FROM `users`
         WHERE `user` = '$user' && `password` = '$password'";
$stmt = $db->prepare($sql);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $stmt->fetchColumn();
echo $row['id'];
 
Müsste das SQL Statement nicht so lauten:
PHP:
$sql  = "SELECT COUNT(*) AS `total`, `id`
         FROM `users`
         WHERE `user` = '$user' && `password` = '$password'";
$stmt = $db->prepare($sql);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $stmt->fetchColumn();
echo $row['total'];

Grüße

tewes
 
Ähm, nein, das hilft nichts.
Wobei mir eh nicht klar ist, was du mit der Änderung echo $row['id']; zu echo $row['total']; erreichen wolltest.

echo $stmt->fetchColumn(); sollte das Ergebnis von count lieferen.
echo $row['id']; soll dann die entsprechende id aus der db liefern.

insofern muss echo $row['id']; ja sowieso stehen bleiben, am ende sollen ja beide sachen ausgegeben werden, nur das funktioniert im mom halt nicht..
 
Da in dem SQL Statement AS `total` steht, hat das Array auch den Index total und wollte den da einfach nur ausgeben.
Hab grad mal in PHPMyAdmin das SQL Statement ausgeführt:
PHP:
SELECT COUNT( * ) AS `total` , `iduser`
FROM `access`
WHERE `iduser` =21
GROUP BY `iduser`
Und als ergebnis bekam ich das:
toal | iduser
-----+---------
1 | 21

Das ist doch das was du haben willst.

Grüße

tewes
 
Wie tewes schon sagte, fehlt Dir das GROUP BY. Sobald Du diese - komme gerade nicht auf den Namen - Funktionen von MySQL wie SUM, MIN, MAX, COUNT, AVG und co. benutzt und zusätzlich noch weitere Spalten aus der Datenbank ausliest, muss Du diese alle ins GROUP BY schreiben. Ist aber auch total logisch, wenn man nurmal kurz drüber nachdenkt. ;)
 
Code:
SELECT COUNT(*), `id`, `user`
FROM `users`
WHERE `user` = '$user' && `password` = '$password'
GROUP BY `user`

Also so geht es nicht. Ich habe noch nie mit GROUP BY gearbeitet. Was muss bei GROUP BY hin und wieso ist dieses GROUP BY total logisch?
 
okaaay, langsam checke ich das...
count zählt die datensätze, die in der bei GROUP BY angegebenen spalte den selben wert haben, richtig?

dann hab ich aber noch ne frage. und zwar ist im php manual folgendes code beispiel:

PHP:
<?php
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
if ($res = $conn->query($sql)) {

    /* Check the number of rows that match the SELECT statement */
  if ($res->fetchColumn() > 0) {

        /* Issue the real SELECT statement and work with the results */
         $sql = "SELECT name FROM fruit WHERE calories > 100";
       foreach ($conn->query($sql) as $row) {
           print "Name: " .  $row['NAME'] . "\n";
         }
    }
    /* No rows matched -- do something else */
  else {
      print "No rows matched the query.";
    }
}

$res = null;
$conn = null;
?>

In der SQL-Abfrage kommt nun COUNT vor, allerdings ohne GROUP BY.
Wie kann das denn funktionieren?
1. habe ich bei meinen recherchen gelesen, dass count niemals ohne group by verwendet werden darf
2. ist es ja auch rein logisch nicht nachvollziehbar. wenn kein group by angegeben ist, nach welcher spalte fast er dann zusammen?
 
Stellen wir uns folgende Tabelle vor:

SPEISEPLAN
-id-int
-calories-int


Jetzt kannst Du doch wunderbar alle Datensätze durchzählen, wo der Kalorienwert (calories) größer als 100 ist. Du bekommst dann als Ergebnis einfach schlichtweg eine Zahl.

GROUP BY muss in Verbindung mit COUNT, SUM, AVG, MIN, MAX nur dann genutzt werden, wenn auch weitere Felder ausgelesen werden sollen - in deinem Fall id und user. Diese müssen dann gruppiert werden.
 
Zurück
Oben