SQL Abfrage über mehrere Spalten (Count)
Wyzau
- php
Hi!
Ich habe eine Tabelle, die folgendermaßen aussieht (und die ich auch leider so nicht wirklich ändern kann):
turnier | spielerdesturniers | spielerdesturniers2 | spielerdesturniers3
1 | a
2 | b | d
3 | a | c
4 | a | b | c
Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:
spieler | anzahl
a | 3
b | 2
c | 2
d | 1
Bisher habe ich folgende Select-Abfrage:
SELECT turniere.spielerdesturniers, COUNT(turniere.spielerdesturniers) AS 'sdt' FROM turniere GROUP by turniere.spielerdesturniers ORDER BY sdt DESC
klar, diese Abfrage bezieht nur die Spalte 'spielerdesturniers' mit ein.
Wie gestaltet sich da meine Abfrage, wenn ich die restlichen Spalten addieren möchte?
Addiert wird wie überall mittels +-Operator
a+b+c=d
oder in deinem Fall
COUNT(a)+COUNT(b)+COUNT(c)=d
Addiert wird wie überall mittels +-Operator
a+b+c=d
oder in deinem Fall
COUNT(a)+COUNT(b)+COUNT(c)=d
Grundsätzlich ein schöner (weil für mich einfach zu realisierender) Gedanke. Wenn jetzt aber ein Spieler e oder Spieler f dazukommt, bringt mir die Abfrage nichts mehr - ich müsste alle Namen wissen und die Abfrage jedes Mal dementsprechend anpassen.
moin,
turnier | spielerdesturniers | spielerdesturniers2 | spielerdesturniers3
1 | a
2 | b | d
3 | a | c
4 | a | b | c
das sind 4 spalten in der tabelle, dann sollte jeder datensatz auch mit 4 spalten angeben werden. dort wo nichts drinne steht, führe das feld trotzdem auf und setze NULL als "wert" ein.
Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:
und spieler des turniers hat dann auch immer gewonnen, sprich es gibt pro turnier 1 bis 3 gewinner ? wenn dem so ist:
SELECT t.Gewinner, COUNT(*) Anzahl
FROM (SELECT spielerdesturniers Gewinner
FROM turniere
UNION ALL
SELECT spielerdesturniers2
FROM turniere
SELECT spielerdesturniers3
FROM turniere
) t
WHERE t.Gewinner IS NOT NULL
GROUP BY t.Gewinner
ORDER BY t.Gewinner
;
Ilja
das sind 4 spalten in der tabelle, dann sollte jeder datensatz auch mit 4 spalten angeben werden. dort wo nichts drinne steht, führe das feld trotzdem auf und setze NULL als "wert" ein.
Das hab ich jetzt gemacht - alle Felder, wo nichts drin war, habe ich auf NULL gesetzt.
Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:
und spieler des turniers hat dann auch immer gewonnen, sprich es gibt pro turnier 1 bis 3 gewinner ? wenn dem so ist:
Ja, ich will einfach eine Tabelle, wo drin steht, wie oft jeder schon Spieler des Turniers war.
SELECT t.Gewinner, COUNT(*) Anzahl
FROM (SELECT spielerdesturniers Gewinner
FROM turniere
UNION ALL
SELECT spielerdesturniers2
FROM turniere
SELECT spielerdesturniers3
FROM turniere
) t
WHERE t.Gewinner IS NOT NULL
GROUP BY t.Gewinner
ORDER BY t.Gewinner
;Ilja
Leider funktioniert das bei mir nicht. Meine MySql Version ist laut Phpmyadmin 5.0.32
Kann ich irgendwie nachschauen, wo der Fehler liegen kann?
$sql6= "SELECT t.Gewinner, COUNT(*) Anzahl
FROM (SELECT turniere.spielerdesturniers Gewinner
FROM turniere
UNION ALL
SELECT turniere.spielerdesturniers2
FROM turniere
SELECT turniere.spielerdesturniers3
FROM turniere
) t
WHERE t.Gewinner IS NOT NULL
GROUP BY t.Gewinner
ORDER BY t.Gewinner";
$query6 = mysql_query($sql6) or die("Anfrage6 nicht erfolgreich");
moin,
Leider funktioniert das bei mir nicht. Meine MySql Version ist laut Phpmyadmin 5.0.32
Kann ich irgendwie nachschauen, wo der Fehler liegen kann?
es fehlte ein UNION ALL
SELECT t.Gewinner, COUNT(*) Anzahl
FROM (SELECT turniere.spielerdesturniers Gewinner
FROM turniere
UNION ALL
SELECT turniere.spielerdesturniers2
FROM turniere
UNION ALL -- dieses UNION ALL fehlte
SELECT turniere.spielerdesturniers3
FROM turniere
) t
WHERE t.Gewinner IS NOT NULL
GROUP BY t.Gewinner
ORDER BY t.Gewinner
;
Hurra! So funktionierts! Vielen vielen Dank!
Hallo,
ich stehe gerade vor exakt dem gleichen Problem.
Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
Kennt jemand einen anderen Weg?
Hi!
Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
Kennt jemand einen anderen Weg?
Ohne jetzt genau das Problem angeschaut zu haben: generelle Möglichkeiten sind temporäre Tabellen und Joins. Siehe auch Rewriting Subqueries as Joins.
Lo!
moin,
ich stehe gerade vor exakt dem gleichen Problem.
Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
genau das gleiche problem wird es sicherlich nicht sein, deswegen müsstest du es genauer ausführen. aber zu dem was Dedlfix gesagt hat könnten eventuell views zum einsatz kommen. kenne mich allerdings mti den versionen von mysql vor 4.1 nicht aus.
Ilja
Hi!
Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
aber zu dem was Dedlfix gesagt hat könnten eventuell views zum einsatz kommen. kenne mich allerdings mti den versionen von mysql vor 4.1 nicht aus.
Nee, Views gibt es erst ab 5.0.
Lo!
moin,
ok, das schockiert mich jetzt ein wenig, views erst ab 5.0 ist....erschreckend
Ilja
Hi!
Nee, Views gibt es erst ab 5.0.
ok, das schockiert mich jetzt ein wenig, views erst ab 5.0 ist....erschreckend
Naja, wenn ich mir die Anzahl der Fragen hier ansehe, die sich um Views drehen, bekomme ich den Eindruck, dass die sowieso niemand verwendet. Ebensowenig sehe ich Lösungsvorschläge, die Views propagieren.
Wo spielen Views denn überhaupt eine Rolle, außer einem abfragenden Programm eine Tabelle vorzugaukeln, die in der Form gar nicht existiert? Sowas braucht man im Prinzip doch nur für fertige Software, wie ORMs, wenn diese nur 0815-Abfragen stellen kann, oder?
Lo!
moin,
Naja, wenn ich mir die Anzahl der Fragen hier ansehe, die sich um Views drehen, bekomme ich den Eindruck, dass die sowieso niemand verwendet.
das liegt wohl eher an der natur des forums, dass hier viele fragen bezüglich datenbanken doch eher "einfach" sind. daraus den schluss zu ziehen, views werden nicht gebraucht, den kann ich nicht nachvollziehen. das hat man ja ganz offensichtlich bei mysql auch anders bewertet, sonst wären sie nicht eingeführt worden.
Wo spielen Views denn überhaupt eine Rolle, außer einem abfragenden Programm eine Tabelle vorzugaukeln, die in der Form gar nicht existiert?
grundsätzlich überall dort, wo ich die "realen" objekte und inhalte hinter einer view verbergen will oder aber mir das leben erleichtern will, um komplexe sql statements nicht immer neu schreiben zu müssen, bzw. ich dadurch redundante abfragen vermeide und somit auch fehler vorbeugen kann.
Sowas braucht man im Prinzip doch nur für fertige Software, wie ORMs, wenn diese nur 0815-Abfragen stellen kann, oder?
sehe ich anders, mit views kann ich eine weitere logische ebene schaffen, sprich ich habe damit einen weiteren schritt zur datenbankunabhängigkeit. anwendung A braucht eine andere sicht der dinge als anwendung B. des weiteren sind views eine gute möglichkeit für das sicherungskonzept. ich will nicht, dass jeder immer gleich die ganze tabelle sehen kann, sondern dass ich bestimmte spalten ausblende, anders darstelle oder nur bestimmte datensätze selektiert werden.
Ilja