2017-04-13 8 views
0

Ich habe eine Match-Tabelle mit allen Geschichte Spielen in einer Fußball-Division gespielt. Es geht um 30000 Spiele und meine Herausforderung ist es, die Gewinne, Draw und Loses für ein bestimmtes Team im Vergleich zu den anderen zu gewinnen.Wie kann ich die Ergebnisse von zwei Abfragen basierend auf der Group BY-Spalte zusammenfassen?

Für meine Frage werde ich nur verwenden die zieht, um meine zieht Ich habe 2 mögliche Szenarien abrufen:

  1. Das Team ist der Heimmannschaft

  2. Das Team der weg ist

    Team

So und nach meinen Daten der Abfrage für das erste Szenario, in dem mein Team die Heimmannschaft ist wie folgt:

SELECT 
    matches.away_team as VS, 
    COUNT(matches.idmatch) AS TIES 
FROM 
    my_football_database.matches 
WHERE 
    home_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
GROUP BY 
    away_team 
LIMIT 5; 

Ausgang:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 1 | 
| 3 | 3 | 
| 4 | 2 | 
| 8 | 1 | 
| 9 | 3 | 
+------+------+ 

Das zweite Szenario ist, wenn mein Team die Mannschaft ist, so geht es wie folgt aus:

SELECT 
    matches.home_team as VS, 
    COUNT(matches.idmatch) AS TIES 
FROM 
    my_football_database.matches 
WHERE 
    away_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
GROUP BY 
    home_team 
LIMIT 5; 

Ausgang:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 4 | 
| 3 | 2 | 
| 7 | 1 | 
| 8 | 3 | 
| 9 | 1 | 
+------+------+ 

Wie Sie können als Beispiel sehen:

  • wenn mein Team (ID = 14) wurde als Heimmannschaft vs Team ID = 3, insgesamt 3 Partien endeten als Verbindungs ​​
  • In der zweiten Folge zu spielen, wenn mein Team (ID = 14) war als die Auswärtsteam vs Team ID = 3, insgesamt 2 Spiele endete als eine Krawatte

Wie kann ich das Ergebnis der TIES, basierend auf den "VS" Ids summieren? Wenn Sie zum Beispiel alle Ties für ein Team, das als Heimmannschaft spielt, nach dem Auswärtsteam gruppiert und alle Ties für ein Team aufteilen, das als Auswärtsmannschaft spielt, gruppiert nach dem Heimteam, verbinden Sie beide Spalten basierend auf der "Vs" ID.

Das Ergebnis Beispiel in diesem Fall wäre:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 5 | 
| 3 | 5 | 
| 4 | 2 | 
| 7 | 1 | 
| 8 | 4 | 
| 9 | 4 | 
+------+------+ 

HINWEIS: Ich habe bis zu dem Punkt zu erhalten, die eine einzelne Abfrage, mich mit allen Wins eine Tabelle geben kann, ein Verliert und Unentschieden für gegebenes Team, gruppiert nach der Mannschaft, gegen die sie gespielt haben.

Das sind 14 Gesamtszenarien. Heim- und Auswärts-Unentschieden (2), Heim- und Auswärts-Unentschieden gewinnt regelmäßig, vergeben und im Elfmeterschießen (6). Heim und Auswärts verliert regelmäßig, vergeben und im Elfmeterschießen (6).

Daher bin ich nicht auf der Suche nach einem Stück Code, der die Unentschieden lösen kann, sondern eher wie ein Tipp auf, was für dieses Problem zu studieren, zu erforschen oder zu implementieren. Meine erste Idee wäre, jedes Szenario separat zu erstellen und sie dann als Unterabfragen zu verwenden, aber mir wurde gesagt, dass dies für die Leistung nicht geeignet ist.

+0

kann ich nicht Ihre Beschreibung verstehen. Können Sie eine Probe der gewünschten Ergebnisse zeigen? – Barmar

+0

Ich habe gerade eine hinzugefügt und versucht, besser zu erklären. Vielen Dank! –

Antwort

0

Verwenden CASE Konstrukte:

select 
    otherteam, 
    count(case when mygoals > othergoals then 1 end) as won, 
    count(case when mygoals = othergoals then 1 end) as ties, 
    count(case when mygoals < othergoals then 1 end) as lost 
from 
(
    select 
    11 as myteam, 
    case when home_team = 11 then away_team else home_team end as otherteam, 
    case when home_team = 11 then home_team_goals else away_team_goals end as mygoals, 
    case when home_team = 11 then away_team_goals else home_team_goals end as othergoals 
    from mydb.matches 
    where (home_team = 11 or away_team = 11) 
) whoiswho 
group by otherteam; 

(Oops, sorry, ich denke, das ist etwas mehr als die "wie ein HINT".)

+0

Diese Art löste alles, Genie. Obwohl ich mich hinsetzen und die Fallkonstruktionen studieren werde. Vielen Dank! –

0

Verwenden Sie eine UNION der zwei Abfragen und dann die Zeilen mit der gleichen VS Spalte.

SELECT VS, SUM(TIES) AS TIES 
FROM (
    (SELECT matches.away_team as VS, count(matches.idmatch) as TIES 
    from my_football_database.matches WHERE home_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
    GROUP BY away_team 
    LIMIT 5) 
    UNION ALL 
    (SELECT matches.home_team as VS, count(matches.idmatch) as TIES 
    from my_football_database.matches WHERE away_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
    GROUP BY home_team 
    LIMIT 5)) AS u 
GROUP BY VS 
Verwandte Themen