# Fußball-Tabelle berechnen



## socke999 (5. Mai 2009)

Hallo,
ich habe mal eine grundlegende Frage zur Performance.

Als ich habe in meine MYSQL Datenbank die gesamten Fußballspieltage mit Ergebnisse meiner Fußballmannschaft für die Vereinswebseite. Nun würde mich interessieren wie es am besten wäre die Tabelle zu berechnen:

Mir fallen im Moment 2 Möglichkeiten ein:

Normal berechnen wenn der normale Webseitenbesucher die Tabellenseite aufruft. Wie lange dauert so etwas wohl? Ich glaube nicht dass das so anstrengend für den Server ist dass es zu störungen kommen könnte, aber ich weiß ja nicht so genau ... Weiß jemand mehr? Also angenommen (mit hohen zahlen) es sind 50 Teams: also somit insgesamt 98 Spieltage. Pro Spieltag sind dass dann 25 Begegnungen. Also muss jedes mal beim Seitenaufruf 2450 (25 * 98) Spiele mit PHP ausgewertet werden und diese dann nach Punkte sortieren. Ist so etwas Überbelastung für einen PHP Server?
Die Tabelle berechnen sobald ein Ergebnis bzw. Spieltag eingegeben wird und die Tabelle dann in einer Datenbank ober File abspeichern. Die Tabellenseite der Webseite ließt dann nur diese Tabelle aus und muss sie nicht jedesmal berechnen

Fällt jemand noch eine andere Möglichkeit ein oder was sagt ihr generell dazu?


----------



## chmee (5. Mai 2009)

Da Spieltage nicht allzu dynamisch sind, würde ich auch eher auf Variante 2 gehen, nämlich nach Eingabe der Ergebnisse eine Neuberechnung einer zweiten Tabelle machen. Die wird einfach nur ausgelesen und angezeigt.

Alternativ wäre ein Cronjob, der 1x täglich diese Ergebnis-Tabelle berechnet (zB Mitternachts), so dass Du "nur" die eine Tabelle auffüllst, die zweite wird automatisch berichtigt.

mfg chmee


----------



## Tim Bureck (5. Mai 2009)

Instinktiv würde ich mich für die zweite Variante entscheiden. Ich glaube der Seitenaufbau würde sich doch merkbar verzögern, wenn du die immer neu berechnest.


----------



## socke999 (5. Mai 2009)

Ja also primär würd ich auch zur Variante 2 tendieren und diese implementieren...
Aber ich weiß ja nicht so, da ich so etwas zum ersten mal mache, vielleicht gibts da ja etwas was auf dass ich noch gar nicht gekommen bin ...


----------



## Maniac (5. Mai 2009)

Also ich lasse das bei mir in einer Dartliga komplett in MySQL berechnen, ausgegeben wird dann praktisch nur das Array. Performancenachteile habe ich bisher keine feststellen können, alles läuft super schnell.


```
$db->query("SELECT
	t.teamname,
	@heimpunkte := (SELECT sum(s.heimpunkte) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) heimpunkte,
	@gastpunkte := (SELECT sum(s.gastpunkte) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) gastpunkte,
	@heimgegen := (SELECT sum(s.heimpunkte) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) heimgegen,
	@gastgegen := (SELECT sum(s.gastpunkte) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) gastgegen,
	@heimspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) heimspiele,
	@gastspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) gastspiele,
	@heimgegenspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) heimgegenspiele,
	@gastgegenspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE heim = t.id $aktiv GROUP BY t.id LIMIT 1) gastgegenspiele,
	@spiele_all := (@heimspiele + @gastspiele) spiele_all,
	@gegen_all := (@heimgegenspiele + @gastgegenspiele) gegen_all,
	@spiele_diff := (@spiele_all - @gegen_all) spiele_diff,
	@heim_all := (@heimpunkte + @gastpunkte) heim_all,
	@gast_all := (@heimgegen + @gastgegen) gast_all,
	@punkte_diff := (@heim_all - @gast_all) punkte_diff,
	@tuniere := (SELECT count(s.id) FROM spielplan s WHERE s.gast=t.id AND s.entry=1 OR s.heim=t.id AND s.entry=1 $aktiv GROUP BY t.id LIMIT 1) tuniere
FROM
	teams t
WHERE
	t.liga_id=$liga $aktiv 
GROUP BY
	t.id
ORDER BY
	punkte_diff DESC,
	tuniere ASC,
	spiele_diff DESC");
```


----------



## socke999 (5. Mai 2009)

Natürlich könnte man das auch per MYSQL machen ...
allerdings, würde ich da wohl rekursives SQL benötigen, und MYSQL kann sowas meinen Wissenstands nach nicht. 

Wie genau ist deine Datenbanktabelle gemacht? 
du hast eine tabelle team, eine tabelle spielplan und die stehen in einer 1:n beziehung

wie sieht die tablle spielplan genauer aus?
du hast da die spalten heimpunkte, gastpunkte, heim, gast ...
Allerdings versteh ich da nicht wo das resultat abgespeichert wird, also wer wieviel gewonnen hat, sind das die Spalten heimpunkte und gastpunkte oder wie?


----------



## Maniac (5. Mai 2009)

Also ich erstelle mir am Anfang einen Spielplan, dort werden alle Ergebnisse dann beim Eintragen des Spieles upgedatet.
Die Resultate werden in den Variablen gespeichert. Mit denen kannst Du dann ganz normal weiterarbeiten im Array.

Ich hab dir mal die Struktur von der Tabelle angehangen. .txt durch .sql ersetzen.

Im Grunde es einfach, Subselects machen und mit diesen dann berechnen.


----------



## socke999 (5. Mai 2009)

was ich noch nicht ganz verstanden habe:
  `heimpunkte` int(2) NOT NULL default '0',
  `gastpunkte` int(2) NOT NULL default '0',
  `heimspiele` int(2) NOT NULL default '0',
  `gastspiele` int(2) NOT NULL default '0',

heimpunkte steht wohl für die Tore des Heimteams und dass selbe für gastpunkte. Oder?
Für was verwendest du die spalte heimspiele und die spalte gastspiele?


----------



## Maniac (5. Mai 2009)

Naja, beim Dart spielen die Sätze auch eine Rolle. Bei uns ist es so das ein Ligaspiel aus 18 einzelspielen besteht. 

zb:

Heim : Auswärts
    2      :     16

2 zu 16 sätze bedeutet das das Gastteam die 2 Punkte mitnehmen darf *g*

bei 9:9 spielen ist es unentschieden und jede mannschaft bekommt 1nen punkt. das kannst du natürlich weglassen, dient nur zum errechnen bei Punktegleichheit.


----------

