SELECT-Abfrage
no4
- datenbank
0 Ilja1 Vinzenz Mai0 no4
Hallo zusammen!
Ich habe folgende Tabelle mit den Spalten id,team1,team2,tore1,tore2
Mit
SELECT team1,sum(if (tore1>tore2,3,if (tore1=tore2,1,0))) FROM spiele GROUP BY team1
erhalte ich alle Punkte, die ein Team bei Spielen erreicht hat, bei denen das Team an erster Stelle steht.
Analog geht das auch, wenn das Team an zweiter Stelle steht:
SELECT team2,sum(if (tore2>tore1,3,if (tore2=tore1,1,0))) FROM spiele GROUP BY team2
Klar, kann man jetzt die Ergebnisse der Abfragen einfach zusammenzählen.
Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?
Viele Grüße
no4
moin,
Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?
klar kann man das, aber was wilst du machen, eine Tabelle aufbauen?
Ilja
Wir haben seit längerem ein Tippspiel laufen.
Und da wird u. a. die Tabelle angezeigt. Da ich hier sowieso auch Heim- und Auswärtstabelle angezeigt habe, habe ich die Gesamttabelle aus den beiden berechnet.
Aber jetzt so kurz vor der WM bin ich auf die Ewige Tabelle gestoßen.
Und bei einem WM-Spiel ist es ja bedeutungslos, wer zuerst genannt wird.
Ich hab hier also kein Heim- und Auswärtstabelle, sondern zwei Tabellen aus willkürlich ausgwählten Spielen.
Im Prinzip gehts mir darum, mehr von MySQL zu verstehen.
Grüße no4
moin,
Im Prinzip gehts mir darum, mehr von MySQL zu verstehen.
suche mal im archiv, ich hatte in mysql schon mal eine abfrage gemacht, wie sich eine komplette tabelle berechnen läßt.
Ilja
Hallo,
SELECT team1,sum(if (tore1>tore2,3,if (tore1=tore2,1,0))) FROM spiele GROUP BY team1
Analog geht das auch, wenn das Team an zweiter Stelle steht:
SELECT team2,sum(if (tore2>tore1,3,if (tore2=tore1,1,0))) FROM spiele GROUP BY team2
Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?
1. UNION ALL der beiden Abfragen
-- Punkte aus den Heimspielen
SELECT
team1 team,
SUM(IF(tore1 > tore2, 3, IF(tore1 = tore2), 1, 0))) punkte
FROM
spiele
GROUP BY
team1
UNION ALL
-- Punkte aus den Auswärtsspielen
SELECT -- hier sind keine Spaltenaliasnamen mehr zulässig
team2,
SUM(IF(tore2 > tore1, 3, IF(tore2 = tore1), 1, 0)))
FROM
spiele
GROUP BY
team2
2. summiere die Punktespalte (der Du einen hübschen Spaltennamen verpasst hast) und gruppiere nach der Teamspalte:
SELECT
s.team,
SUM(s.punkte) gesamtpunkte -- hier kannst Du den Aliasnamen, den Du
-- im ersten Teil der UNION festgelegt hast,
-- verwenden.
FROM (
SELECT
team1 team,
SUM(IF(tore1 > tore2, 3, IF(tore1 = tore2), 1, 0))) punkte
FROM
spiele
GROUP BY
team1
UNION ALL
SELECT
team2,
SUM(IF(tore2 > tore1, 3, IF(tore2 = tore1), 1, 0)))
FROM
spiele
GROUP BY
team2
) s -- der Aliasname für die Unterabfrage ist zwingend erforderlich
GROUP BY
s.team
ORDER BY -- Zusatz von mir, hättest Du auch selbst hinbekommen
SUM(s.punkte) DESC -- üblicherweise sind Fußballtabellen nach
-- erzielten Punkten absteigend sortiert :-)
-- in MySQL wäre auch ORDER BY gesamtpunkte erlaubt,
-- in Standard-SQL nicht.
Da solche Tabellen üblicherweise nicht besonders umfangreich sind, machte ich mir über Performance wenig Gedanken :-)
Freundliche Grüße
Vinzenz
Hai!
UNION ALL ist bisher an mir vorbeigegangen.
Werde ich mir mal anschauen.
Danke schon mal
Grüße
Jochen