Tobias Kleeberger: Wieviele Ergebnisse gefunden? (DB = mysql)

Hallo [smile]

Wie kann ich bitte herausfinden wieviele Ergebnisse eine Abfrage lieferte?
Zum einen möchte ich herausfinden,  wieviele Einträge überhaupt in der Tabelle sind,
und zum anderen möchte ich herausfinden wieviele Eintrage auf  ... WHERE city LIKE 'M%' geliefert werden.

Ich denke zwar an COUNT(),  (keine AHnung ob COUNT(*) oder COUNT(id), mir ist der Unterschied nicht bewusst)
aber meines Erachtens darf man COUNT() so nicht anwenden,
weil COUNT() als "Aggregate Function" nur in Verbindung mit GROUP BY Verwendung finden darf.

Mein Ansatz war:
SELECT id, COUNT(id) FROM anwender GROUP BY id;

Jedoch gibt das keine einzelne Zahl zurück wieviele Ergebnisse gefunden wurden, sondern eine Tabelle

+----+-----------+
| id | COUNT(id) |
+----+-----------+
|  5 |         1 |
|  6 |         1 |
|  7 |         1 |
+----+-----------+

Auch zusammen mit WHERE muss es gehen,
um zu wissen wieviele Ergebnisse gefunden wurden.

Ohne GROUP BY würde es wahrscheinlich gehen,
jedoch als Aggregate Function" darf es ohne GROUP BY gar nicht stehen.

Selbst wenn, wäre nicht klar wonach gruppiert wird.

Auch wenn ich denke keine Lösung zu finden,
sage ich trotzdem mal ein breites D_A_N_K_E falls doch wer eine Antwort kennt.

Tobias Kleeberger

  1. Hi,

    also zunächst mal: Ja, eigentlich COUNT nur bei GROUP BY, allerdings ist das bei den mir bekannten Systemen durchaus kein Problem ein COUNT ohne einzusetzen, sofern du keine einzelnen Spalten abfragst:
    SELECT COUNT(*) -> Anzahl der Datensätze
    SELECT COUNT(*), id ... GROUP BY id -> gruppiere nach ID und dann gib aus wieviele zu welcher ID gefunden wurden

    Du wirst somit aber tatsächlich ein Problem haben in EINER Abfrage rauszufinden wieviele Sätze es gibt und welche das sind. Falls du SUBSELECTs verwenden kannst/willst, dann ginge einmal das SELECT spalten FROM a und ein SELECT COUNT(*) FROM a und das ganze per INNER JOIN über 1=1. Wäre Schwachsinn, aber ginge.

    Ansonsten, wenn du nur die Anzahl der Ergebnisse haben willst, dann lassen sich da auch Statuscodes der Datenbank bzw. der Skriptsprachen verwenden.

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. echo $begrueszung;

      Ansonsten, wenn du nur die Anzahl der Ergebnisse haben willst, dann lassen sich da auch Statuscodes der Datenbank bzw. der Skriptsprachen verwenden.

      Wenn man _nur_ die Anzahl der betroffenen Datensätze haben will, mag dieses Ergebnis durchaus mit mysql_num_rows() ermittelbar sein. Jedoch klappt dies bei odbc_num_rows() nicht mehr richtig.

      Es mag zwar mit etwas weniger eigenen Programmieraufwand verbunden sein

      xxx_query('SELECT ... FROM ...');
      echo xxx_num_rows();

      statt

      xxx_query('SELECT COUNT(*) AS anzahl FROM ...');
      $row = xxx_fetch_row();
      echo $row['anzahl'];

      zu tippen. Jedoch hat man dann nicht berücksichtigt, dass die Datenbank bei der ersten Methode unnötigerweise ein Result-Set zusammenstellt und dafür Ressourcen verbraucht.

      echo "$verabschiedung $name";

  2. Hallo,

    Wie kann ich bitte herausfinden wieviele Ergebnisse eine Abfrage lieferte?
    Zum einen möchte ich herausfinden,  wieviele Einträge überhaupt in der Tabelle sind,
    und zum anderen möchte ich herausfinden wieviele Eintrage auf  ... WHERE city LIKE 'M%' geliefert werden.

    Ich denke zwar an COUNT(),  (keine AHnung ob COUNT(*) oder COUNT(id), mir ist der Unterschied nicht bewusst)

    Count(*) zählt alle betroffenen Datensätze. Count(id) zählt die betroffenen Datensätze, die eine id != NULL haben.

    aber meines Erachtens darf man COUNT() so nicht anwenden,
    weil COUNT() als "Aggregate Function" nur in Verbindung mit GROUP BY Verwendung finden darf.

    Nein, andreasrum ;-))

    Bei der Verwendung von GROUP BY dürfen als Felder im Resultset nur die gruppierten Felder oder Aggregatfunktionen stehen. Bsp.:
    SELECT name, vorname FROM tabelle GROUP BY name
    ist problematisch, weil nicht bestimmt ist, welcher Vorname z.B. bei mehrfachem Auftreten eines Namens im Resultset steht. Bei
    Maier, Ines
    Maier, Klaus
    Maier, Michael
    wird ja, nach Name gruppiert, dann im Resultset Maier nur einmal stehen. Welcher Vorname ist dann aber richtig?

    SELECT name, SUM(betrag) FROM tabelle GROUP BY name
    ist unproblematisch, weil z.B. für alle Maier die Summe der Beträge gebildet werden kann.

    SELECT COUNT(*) FROM tabelle
    und
    SELECT COUNT(*) FROM tabelle WHERE city LIKE 'M%'
    ist aber durchaus korrekt.

    viele Grüße

    Axel