Datenbankabfrage mit count() und group
Steffimon
- datenbank
Hallo,
ich habe eine Mysql Datenbank mit einer Tabelle 'tabelle' und einer Spalte 'spalte'.
in der Tabelle existieren belibig viele Datensätze.
In der Spalte 'spalte' steht jeweils ein String.
Bspl.:
spalte |
---|
hinz |
kunz |
bert |
stef |
kunz |
arsch |
hans |
stef |
stef |
arsch |
bert |
Ich möchte nun eine Ausgabe erzielen, die nicht jeden Eintrag ausgiebt, sondern jeden gleichen String nur _einmal_. Dies kann ich per "SELECT spalte FROM tabelle GROUP BY spalte" erreichen.
Nun möchte ich aber noch ausgeben, wie oft jeder String vorhanden ist. Hierzu könnte ich count() verwenden.
Meine Frage nun: Wie kombiniere ich diese beiden Sachen?
Die Ausgabe soll folgendermaßen aussehen:
hinz 1
kunz 2
bert 2
stef 3
arsch 2
hans 1
Als Scriptsprache steht mit PHP zur Verfügung, falls man das nicht mit SQL hinbekommt.
vielen Dank für euere Hilfe
Steffi
Hi,
Nun möchte ich aber noch ausgeben, wie oft jeder String vorhanden ist. Hierzu könnte ich count() verwenden.
ja, ganz genau.
Meine Frage nun: Wie kombiniere ich diese beiden Sachen?
Just do it. Es ist einfacher als Du denkst.
Als Scriptsprache steht mit PHP zur Verfügung, falls man das nicht mit SQL hinbekommt.
Ein Leichtes für SQL :-)
Cheatah
Just do it. Es ist einfacher als Du denkst.
Hi,
vielen Dank! ich hab folgendes ausprobiert und es funktioniert:
$query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte");
Die Ausgabe mache ich folgendermaßen:
while($query_array = mysql_fetch_array($query_return)) {
echo $query_array[0]." ".$query_array[1]."<br>";
}
Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:
$query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte ODER BY count(spalte) DESC");
Dies funktioniert aber nicht.
Wie kann ich nach der Anzahl der gefundenen Strings sortieren lassen?
vielen Dank für Deine Hilfe
Steffimon
Hi,
Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:
vielleicht solltest Du weniger probieren und mehr Dokumentation lesen. Welches DBMS auch immer Du verwendest, es hat ganz sicher eine Definition der Syntax eines Select-Statements, der Du z.B. entnehmen kannst, in welcher Reihenfolge die GROUP BY- und die ORDER BY-Klauseln notiert werden müssen.
Cheatah
vielleicht solltest Du weniger probieren und mehr Dokumentation lesen. Welches DBMS auch immer Du verwendest, es hat ganz sicher eine Definition der Syntax eines Select-Statements, der Du z.B. entnehmen kannst, in welcher Reihenfolge die GROUP BY- und die ORDER BY-Klauseln notiert werden müssen.
Wo finde ich diese Doku?
Ich hab die Reihenfolge vertauscht, funktioniert immernoch nicht?!
Hi,
Welches DBMS auch immer Du verwendest, es hat ganz sicher [...]
Wo finde ich diese Doku?
wie ich gerade sehe, hast Du irgendwo erwähnt, dass Du MySQL einsetzt. Die Doku findest Du immer beim Hersteller, in diesem Fall also bei http://www.mysql.com/.
Ich hab die Reihenfolge vertauscht, funktioniert immernoch nicht?!
"Funktioniert nicht" funktioniert nicht. Fehlerbeschreibung, bitte. Desweiteren war das nur ein Beispiel, kein Hinweis auf die Fehlerursache ;-)
Cheatah
"Funktioniert nicht" funktioniert nicht. Fehlerbeschreibung, bitte. Desweiteren war das nur ein Beispiel, kein Hinweis auf die Fehlerursache ;-)
query:
SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spalte
fehlerbeschreibung:
es werden keine datensätze abgefragt
Hallo,
Achtung dies ist keine Problemlösung.
oRder By
unten steht oder by
SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spalte
Odium
Hi Steffimon,
query:
SELECT spalte, count(spalte) FROM tabelle ODER BY count(spalte) DESC GROUP BY spaltefehlerbeschreibung:
es werden keine datensätze abgefragt
Du wirfst also die Meldung des Datenbanksystems, welche Dich auf Deinen Syntaxfehler hinweist, ungelesen weg? Keine gute Entscheidung - das macht das Finden von Fehlern generell schwieriger.
Viele Grüße
Michael
Hallo Steffimon,
auch wenn ich Cheatah möglicherweise den Pädagogenspaß (ein Psychoanalytiker schlösse wohl auf "Perverses Ritual") verderbe - schau mal hier nach, wie das mit der ORDER-BY-Klausel geht: http://www.mysql.com/doc/en/SELECT.html.
Nun möchte ich das Ganze nach der Anzahl der gefundenen Strings sortieren. Ich hab das dann so probiert:
$query_return = send_sql("SELECT spalte, count(spalte) FROM tabelle GROUP BY spalte ODER BY count(spalte) DESC");
Dies funktioniert aber nicht.
In Deinem Fall kannst Du ordnen nach einem Aliasnamen oder der Spaltenposition:
SELECT spalte,COUNT(spalte)
FROM blah
GROUP blah
ORDER BY anzahl_spalte DESC
oder
SELECT spalte,COUNT(spalte) AS anzahl_spalte
FROM blah
GROUP blah
ORDER BY 2 DESC
HTH Robert
So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:
SELECT spalte,COUNT(spalte) AS anzahl_spalte
FROM blah
GROUP blah
ORDER BY anzahl_spalte DESC
SELECT spalte,COUNT(spalte)
FROM blah
GROUP blah
ORDER BY 2 DESC
So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:
Hallo srob,
vielen Dank für Deine kompetente Hilfe. Es funktioniert nun.
Schönen Tan noch
Steffi
So ist das Leben in einem Forum mit nicht editierbaren Beiträgen... Ich wollte es so haben, da war es schon unaufhaltbar abgesandt:
Eine Frage hab ich noch:
Ich möchte nun nur die Strings abfragen, die mindestens 3x vorkommen. Ich habe versucht dies so zu lösen:
SELECT spalte,COUNT(spalte) AS anzahl_spalte
FROM blah
WHERE anzahl_spalte > 2
GROUP blah
ORDER BY anzahl_spalte DESC
funktioneirt aber nicht. Es werden keine Datensätze eingelesen?
Wie muss das richtig heissen?
viele Grüße
Steffi
Hallo Steffi,
Ich möchte nun nur die Strings abfragen, die mindestens 3x vorkommen. Ich habe versucht dies so zu lösen:
SELECT spalte,COUNT(spalte) AS anzahl_spalte
WHERE anzahl_spalte > 2
GROUP blah
ORDER BY anzahl_spalte DESC
kann so nicht gehen. Du möchtest die Ergebnismenge des SELECTs nach Anwendung der Aggregatfunktion filtern, dazu solltest Du Dir die HAVING-Klausel ansehen - das ist jetzt mein perverses Ritual ;-).
HTH Robert
kann so nicht gehen. Du möchtest die Ergebnismenge des SELECTs nach Anwendung der Aggregatfunktion filtern, dazu solltest Du Dir die HAVING-Klausel ansehen - das ist jetzt mein perverses Ritual ;-).
aha, ok. Ich verstehe was Du meinst. Es ist nicht möglich nach was zu sortieren, was ich noch garnicht hab, da dies ja erst durch den Query gebildet wird.
Was gibt es für Alternativen? Wie kann ich das lösen?
vielen Dank
Steffi
Hallo Steffi,
aha, ok. Ich verstehe was Du meinst.
Möglicherweise nicht so ganz...
Es ist nicht möglich nach was zu sortieren, was ich noch garnicht hab, da dies ja erst durch den Query gebildet wird.
Was gibt es für Alternativen? Wie kann ich das lösen?
Wie gesagt: mit HAVING. Du selektierst Sätze, gruppierst zählend (aggregierst) sie nach dem Wert in "spalte" und mußt nun noch angeben, daß nur jene Sätze in die Ergebnismenge gruppiert werden sollen, bei denen die Summe größer ist als der von Dir gewünschte Wert - und das macht HAVING.
Vielleicht kommst Du besser mit der deutschen Doku zurecht: http://www.mysql.com/doc/de/SELECT.html.
HTH Robert