
114298
18.10.2016
MySQL: Zwei Spalten in einer View zählen
Hallo,
ich habe eine Fussballdatenbank mit der Tabelle 'Tore' die wie folgt aussieht
Ich möchte nun aus Abfrage wo ich pro Spieler sehe, wie viele er Tore geschossen hat und wie viele Vorlagen er gegeben hat
Mein View sollte so aussehen
Die Tore und und Vorlagen separat zu bestimmen ist kein problem, aber ich bekomme die irgendwie nicht zusammen.
Vielleicht hat einer einen Ansatz
Vielen Dank
ich habe eine Fussballdatenbank mit der Tabelle 'Tore' die wie folgt aussieht
TorID | Spiel | Tor | Vorlage |
1 | MannschaftA-MannschaftB | SpielerA | SpielerB |
2 | MannschaftA-MannschaftB | SpielerA | SpielerC |
3 | MannschaftA-MannschaftB | SpielerB | SpielerD |
4 | MannschaftA-MannschaftB | SpielerE | SpielerC |
Ich möchte nun aus Abfrage wo ich pro Spieler sehe, wie viele er Tore geschossen hat und wie viele Vorlagen er gegeben hat
Mein View sollte so aussehen
Name | Tore | Vorlagen | Scorerpunkte |
SpielerA | 2 | 0 | 2 |
SpielerB | 1 | 1 | 2 |
SpielerC | 0 | 2 | 2 |
SpielerD | 0 | 1 | 1 |
SpielerE | 1 | 0 | 1 |
Die Tore und und Vorlagen separat zu bestimmen ist kein problem, aber ich bekomme die irgendwie nicht zusammen.
Vielleicht hat einer einen Ansatz
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 318172
Url: https://administrator.de/forum/mysql-zwei-spalten-in-einer-view-zaehlen-318172.html
Ausgedruckt am: 12.05.2025 um 06:05 Uhr
11 Kommentare
Neuester Kommentar
Super wäre eine weitere Tabelle die alle Spieler führt und bei Tor und Vorlage nur ein Fremdschlüssel. Es geht natürlich auch ohne auf verschiedenen Wegen.
SELECT coalesce(t1.Spieler,t2.Spieler) AS Spieler, t1.Tore, t2.Vorlagen
FROM ( SELECT Tor AS Spieler, count(*) AS Tore FROM Tore GROUP BY Tor ) t1
FULL OUTER JOIN ( SELECT Vorlage AS Spieler, count(*) AS Vorlagen FROM Tore GROUP BY Vorlage ) t2
ON t1.Spieler = t2.Spieler
Moin memo66,
nur eine Ergänzung zu ukulele-7s Lösung:
Der View selbst wäre dann in etwa so
Wobei die Anweisung "ORDER BY" in einem View zwar erlaubt ist in den meisten DBMSen, aber eigentlich nicht Bestandteil eines Views ist.
Diese Zeile also lieber weglassen und beim Aufrufen des Views ergänzen.
Grüße
Biber
nur eine Ergänzung zu ukulele-7s Lösung:
Der View selbst wäre dann in etwa so
Create View highscorer as (
Select Spieler, Tore, Vorlagen, tore+vorlagen as Scorerpunkte From (
SELECT coalesce(t1.Spieler,t2.Spieler) AS Spiele
, coalesce( t1.Tore, 0) as Tore
, coalesce( t2.Vorlagen, 0) as Vorlagen
FROM (
SELECT Tor AS Spieler
, count(*) AS Tore
FROM Tore
GROUP BY Tor
) t1
FULL OUTER JOIN (
SELECT Vorlage AS Spieler
, count(*) AS Vorlagen
FROM Tore
GROUP BY Vorlage
) t2
ON t1.Spieler = t2.Spieler
) whatever
ORDER by 4, 1
);
Diese Zeile also lieber weglassen und beim Aufrufen des Views ergänzen.
Grüße
Biber
Moin Memo66,
ach ja... mySQL kennt ja keinen FULL OUTER JOIN.
Ok, ANSI-SQL war ja auch nur ein Vorschlag und Standards ´werden total überbewertet.
Dann müssen wir uns halt einen FULL OUTER JOIN aus einem LEFT JOIN, einem RIGHT JOIN und einem UNION ALL zusammenschreddern.
Wäre jedenfalls meine erste spontane Idee.
Grüße
Biber
ach ja... mySQL kennt ja keinen FULL OUTER JOIN.
Ok, ANSI-SQL war ja auch nur ein Vorschlag und Standards ´werden total überbewertet.
Dann müssen wir uns halt einen FULL OUTER JOIN aus einem LEFT JOIN, einem RIGHT JOIN und einem UNION ALL zusammenschreddern.
Create View highscorer as (
Select Spieler, Tore, Vorlagen, tore+vorlagen as Scorerpunkte From (
SELECT coalesce(t1.Spieler,t2.Spieler) AS Spiele
, coalesce( t1.Tore, 0) as Tore
, coalesce( t2.Vorlagen, 0) as Vorlagen
FROM (
SELECT Tor AS Spieler
, count(*) AS Tore
FROM Tore
GROUP BY Tor
) t1
LEFT OUTER JOIN (
SELECT Vorlage AS Spieler
, count(*) AS Vorlagen
FROM Tore
GROUP BY Vorlage
) t2
ON t1.Spieler = t2.Spieler
UNION ALL
SELECT Tor AS Spieler
, count(*) AS Tore
FROM Tore
GROUP BY Tor
) t3
RIGHT OUTER JOIN (
SELECT Vorlage AS Spieler
, count(*) AS Vorlagen
FROM Tore
GROUP BY Vorlage
) t4
ON t3.Spieler = t4.Spieler
WHERE t3.Spieler is NULL
) whatever
ORDER by 4, 1
);
Grüße
Biber
Ich würde dann eher einen anderen Weg gehen:
SELECT t2.Spieler,
sum(CASE WHEN t3.Tor IS NOT NULL THEN 1 ELSE 0 END) AS Tore,
sum(CASE WHEN t4.Vorlage IS NOT NULL THEN 1 ELSE 0 END) AS Vorlagen
FROM (
SELECT DISTINCT t1.Spieler
FROM (
SELECT Tor AS Spieler FROM Tore
UNION ALL
SELECT Vorlage AS Spieler FROM Tore
) t1
) t2
LEFT JOIN Tore t3 ON t2.Spieler = t3.Tor
LEFT JOIN Tore t4 ON t2.Spieler = t4.Vorlage
GROUP BY t2.Spieler
Moin ukulele-7,
dein Ansatz ist natürlich einleuchtender und nachvollziehbarer (unter der Voraussetzung, es gibt keine "Spieler"-Stammdatentabelle).
Da ist es die richtige Strategie, erstmal alle Spieler rauszufieseln, die überhaupt in der "Tore"-Tabelle erwähnt werden und im zweiten Schritt zu ermitteln, warum sie denn erwähnt werden.
Meine Erweiterung bzw meine FULL OUTER JOIN-Simulation war auch mehr eine Trotzreaktion, weil... kann doch nicht wahr sein, dass erwachsene Datenbankimplementierungen nicht mal den Minimalkonsens ANSI-SQL umgesetzt haben.
Von daher: meinen Workaround nicht allzu ernst nehmen.
Grüße
Biber
dein Ansatz ist natürlich einleuchtender und nachvollziehbarer (unter der Voraussetzung, es gibt keine "Spieler"-Stammdatentabelle).
Da ist es die richtige Strategie, erstmal alle Spieler rauszufieseln, die überhaupt in der "Tore"-Tabelle erwähnt werden und im zweiten Schritt zu ermitteln, warum sie denn erwähnt werden.
Meine Erweiterung bzw meine FULL OUTER JOIN-Simulation war auch mehr eine Trotzreaktion, weil... kann doch nicht wahr sein, dass erwachsene Datenbankimplementierungen nicht mal den Minimalkonsens ANSI-SQL umgesetzt haben.
Von daher: meinen Workaround nicht allzu ernst nehmen.
Grüße
Biber
Moin ukulele-7,
meine Abneigung gegen mySQL ist gar nicht so gross.
War mehr ein nicht unterdrücktes Kopfschütteln, weil in mySQL einerseits wirklich viele Sonderlocken zusätzlich implementiert sind, andererseits aber Features fehlen, die du überall als selbstverständlich voraussetzt.
Ungefähr wie bei meinem Lieblings-Gebrauchtwagenhändler...
Dann werd ich solange vor dem Kauf zugeschwatzt mit Details der genialen Einparkhilfe, dem integrierten Staumelder mit der Synchronstimme von Lisa Simpson und dem beheizbaren stufenlos verstellbaren Bremspedal...
Nach dem Kauf dagegen denke ich "Hmm, vielleicht hätte ich doch auch fragen sollen, ob das Autoradio angeschlossen ist, die Scheibenwischer funktionieren und warum ich zum Anlassen immer das rote und das blaue Kabel aneinanderhalten muss.."
Andererseits...
Bei einer normalen Tabellenstruktur (also mit einer referenzierbaren Spieler-Tabelle) hätte auch niemand einen FULL OUTER JOIN gebraucht oder danach gesucht.
Grüße
Biber
meine Abneigung gegen mySQL ist gar nicht so gross.
War mehr ein nicht unterdrücktes Kopfschütteln, weil in mySQL einerseits wirklich viele Sonderlocken zusätzlich implementiert sind, andererseits aber Features fehlen, die du überall als selbstverständlich voraussetzt.
Ungefähr wie bei meinem Lieblings-Gebrauchtwagenhändler...
Dann werd ich solange vor dem Kauf zugeschwatzt mit Details der genialen Einparkhilfe, dem integrierten Staumelder mit der Synchronstimme von Lisa Simpson und dem beheizbaren stufenlos verstellbaren Bremspedal...
Nach dem Kauf dagegen denke ich "Hmm, vielleicht hätte ich doch auch fragen sollen, ob das Autoradio angeschlossen ist, die Scheibenwischer funktionieren und warum ich zum Anlassen immer das rote und das blaue Kabel aneinanderhalten muss.."
Andererseits...
Bei einer normalen Tabellenstruktur (also mit einer referenzierbaren Spieler-Tabelle) hätte auch niemand einen FULL OUTER JOIN gebraucht oder danach gesucht.
Grüße
Biber
Richtig der FULL OUTER JOIN ist selten, ich finde es auch nicht dramatisch wenn der fehlt. Echte Features kann ich aber bei MySQL keine entdecken, nur vermissen. Das einzige was ich als angenehm empfinde ist group_concat() für Gruppierungen, das ist in MSSQL nur recht komplex über XMLPATH möglich.
Wenn ich die absolut freie Wahl hätte würde ich sagen Postgre schlägt jedes MySQL in allen Belangen um längen. Das einzige was mich bei MSSQL hält ist die Unterstützung von vorhandener Software und der Zugriff aufs Dateisystem, das habe ich mal mit PG versucht das lief nicht brauchbar.
Wenn ich die absolut freie Wahl hätte würde ich sagen Postgre schlägt jedes MySQL in allen Belangen um längen. Das einzige was mich bei MSSQL hält ist die Unterstützung von vorhandener Software und der Zugriff aufs Dateisystem, das habe ich mal mit PG versucht das lief nicht brauchbar.
Moin Memo,
sorry, wenn in meinem ungetesteten Schnipsel irgendwo eine Klammer zuviel oder zuwenig.
In der Stadt, in der ich wohne "ischa Freimaak", deshalb werde ich die heute auch nicht mehr durchzählen (können).
Wenn aber die grundsätzliche Idee, das Prinzip hinter dem Entwurf bei dir ankam, dann soll das auch reichen.
wenn du jetzt die Tabellem "Kader" und "Tore2" hast, dann ist das jedenfalls ein besserer Ausgangspunkt.
Jetzt kannst du direkt von der "Kader"-Tabelle aus verjoinen ohne Verrenkungen.
Sinngemäß, soweit ich das heute hinbekomme:
Okay, die Feldnamen können bei dir leicht abweichen, sollten aber wiedererkennbar sein.
Grüße
Biber
, der nachher bestimmt in Halle 7 sein wird
sorry, wenn in meinem ungetesteten Schnipsel irgendwo eine Klammer zuviel oder zuwenig.
In der Stadt, in der ich wohne "ischa Freimaak", deshalb werde ich die heute auch nicht mehr durchzählen (können).
Wenn aber die grundsätzliche Idee, das Prinzip hinter dem Entwurf bei dir ankam, dann soll das auch reichen.
wenn du jetzt die Tabellem "Kader" und "Tore2" hast, dann ist das jedenfalls ein besserer Ausgangspunkt.
Jetzt kannst du direkt von der "Kader"-Tabelle aus verjoinen ohne Verrenkungen.
Sinngemäß, soweit ich das heute hinbekomme:
SELECT kader.Spielername,
SUM( CASE WHEN Tore2t.Tor is NULL THEN 0 ELSE 1 END) as AnzTore,
SUM( CASE WHEN Tore2v.Vorlage is NULL THEN 0 ELSE 1 END) as AnzVorlagen
FROM Kader
LEFT JOIN Tore2 as Tore2t ON Kader.Spieler_id =Tore2t.Tor
LEFT JOIN Tore2 as Tore2v ON Kader.Spieler_id =Tore2v.Vorlage
GROUP BY kader.spieler_Id
Okay, die Feldnamen können bei dir leicht abweichen, sollten aber wiedererkennbar sein.
Grüße
Biber
, der nachher bestimmt in Halle 7 sein wird