2 Stimmen

Soccer SQL Query Heim- und Auswärtsteam Problem

In einer Fußballumgebung möchte ich die aktuellen Tabellen anzeigen. Bedeutung: Punkte und Tore pro Team. Die relevanten Tabellen sehen ähnlich wie folgt aus (vereinfacht).

Spiel Tabelle

uid  (PK)      heimteamid      gastteamid
------------------------------------------------------------------

Ergebnis Tabelle

uid (PK)      heimteamtore   gastteamtore       ergebnistyp (45min, 90min, ..)
-------------------------------------------------------------------

Team Tabelle

uid (PK)       name            kurzname           symbol
------------------------------------------------------------------

Jetzt komme ich nicht darauf, wie ich die Tabelle in einer Abfrage schreiben kann. Was ich geschafft habe, war eine Abfrage zu schreiben, die nur die "Heimspiele"-Tabelle zurückgibt. Ich denke, das ist der einfache Teil. So sieht es jedenfalls aus:

SELECT  ht.name, 
        Count(*) Als Spiele,   
        SUM(res.heimteamtore) ALS Tore, 
        SUM(res.gastteamtore) ALS Gegnertore, 
        SUM(res.heimteamtore - res.gastteamtore) ALS Tordifferenz,         
        SUM(res.heimteamtore > res.gastteamtore) * 3 + SUM(res.heimteamtore = rep.gastteamtore) Als Punkte

FROM liga_liga l

JOIN liga_spieltag gd
     ON gd.ligaid = l.uid

JOIN liga_spiel m
     ON m.spieltagid = gd.uid

JOIN liga_ergebnis res
     ON res.spielid = m.uid 
     AND res.ergebnistyp = 2

JOIN liga_team ht
     ON m.heimteamid = ht.uid

Where l.uid = 1

Group By ht.uid

Order By Punkte DESC, Tordifferenz DESC

Irgendwelche Ideen, wie man dies ändern kann, damit es Heim- und Auswärtsspiele zurückgibt, würden sehr geschätzt.

Vielen Dank,
Robin

1voto

Erstellen Sie Ansichten. Wenn Ihre Daten nicht oft geändert werden und Sie Leistung benötigen, erstellen Sie eine oder mehrere vorausberechnete Tabellen.

Ansichten in MySQL sind nur Pseudotabellen, die dynamisch aus einer SELECT-Abfrage berechnet werden. Mit dem SQL aus Ihrer Frage können Sie eine Ansicht der Heimspielergebnisse erstellen: CREATE VIEW homegames AS SELECT ... Dann das Gleiche für Auswärtsspiele tun. Dann wird es einfach sein, beide Ansichten in einer dritten zu synthetisieren (Sie müssen nur die Spalten summieren).

Ansichten haben mindestens einen Nachteil: sie sind langsam. Eine Ansicht, die auf Ansichten aufgebaut ist, entspricht der Verwendung komplexer Unterabfragen, und MySQL ist darin ziemlich schlecht. Ich glaube nicht, dass dies für Sie ein Problem darstellt, da Sie wahrscheinlich höchstens mit Hunderten von Spielen umgehen. Aber wenn Sie feststellen, dass diese Ansichten zu langsam sind, um abgefragt zu werden, und vorausgesetzt, Sie verwenden keine Art von Cache, die dies abmildern könnte, verwenden Sie einfache Tabellen anstelle von Ansichten. Natürlich müssen Sie sie synchronisieren. Sie können jedes Mal, wenn Sie ein neues Spiel haben, TRUNCATE und INSERT INTO homegames SELECT ... verwenden, oder Sie können intelligenter sein und einfach die Tabellen mit UPDATE aktualisieren. Beides ist richtig, je nach Ihren Bedürfnissen.

0voto

Evernoob Punkte 5556

Könntest du das nicht in eine gespeicherte Prozedur oder Funktion auslagern, die aufgerufen wird, anstatt eine so verdammte komplizierte Abfrage zu erstellen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X