18.032015

HowTo: Fussball Ergebnisverwaltung Teil 2

Vor kurzem hatte ich mich bereits mit dem ersten Teil der “Ergebnisverwaltung” an alle fussballverrückten Zocker gerichtet.

Heute geht es weiter mit der Auswertung der gespeicherten Spielpaarungen. Wer erziehlt bessere Ergebnisse, wenn er als Heim, wer bessere Ergebnisse, wenn er als Gast antritt. Oder wer steht, wenn man den Durchschnitt betrachtet, am Besten da?

Das sind die entscheidenen Fragen, die es zu klären gilt.

Für mein Beispiel werde ich mit Datenbankviews arbeiten. Zuerst erstellen wir uns also die Heim-

CREATE OR REPLACE VIEW standings_home as
SELECT
    home_oppponent_id as opponent_id,
    count(DISTINCT fixtures_id) as games,
    sum(CASE WHEN home_goals > away_goals THEN 1 ELSE 0 END) as wins,
    sum(CASE WHEN home_goals = away_goals THEN 1 ELSE 0 END) as draws,
    sum(CASE WHEN home_goals < away_goals THEN 1 ELSE 0 END) as loses,
    sum(home_goals) as goals_for,
    sum(away_goals) as goals_against,
    (sum(home_goals) - sum(away_goals)) as goals_difference,
    sum(
        CASE
            WHEN home_goals > away_goals THEN 3
            WHEN home_goals = away_goals THEN 1
            ELSE 0
        END) as points
FROM fixtures
GROUP BY home_oppponent_id

und dann die Gast-Tabelle als Datenbankview:

CREATE OR REPLACE VIEW standings_away as
SELECT
    away_oppponent_id as opponent_id,
    count(DISTINCT fixtures_id) as games,
    sum(CASE WHEN away_goals > home_goals THEN 1 ELSE 0 END) as wins,
    sum(CASE WHEN away_goals = home_goals THEN 1 ELSE 0 END) as draws,
    sum(CASE WHEN away_goals < home_goals THEN 1 ELSE 0 END) as loses,
    sum(away_goals) as goals_for,
    sum(home_goals) as goals_against,
    (sum(away_goals) - sum(home_goals)) as goals_difference,
    sum(
        CASE
            WHEN away_goals > home_goals THEN 3
            WHEN away_goals = home_goals THEN 1
            ELSE 0
        END) as points
FROM fixtures
GROUP BY away_oppponent_id

Aus diesen beiden Datenbankviews kann dann ganz einfach die komplette Tabelle berechnet werden. Dies ebenfalls als Datenbankview

CREATE OR REPLACE VIEW standings as
SELECT
    opponent_id,
    sum(games) as games,
    sum(wins) as wins,
    sum(draws) as draws,
    sum(loses) as loses,
    sum(goals_for) as goals_for,
    sum(goals_against) as goals_against,
    sum(goals_difference) as goals_difference,
    sum(points) as points
FROM (
    SELECT
        *
    FROM standings_home
    UNION ALL
    SELECT
        *
    FROM standings_away
) as inner_view GROUP BY oppponent_id

Ggf. kann es je nach Umfang der vorliegenden Spielpaarungen aber sinnvoller sein, dass mit vorberechneten Tabellen gearbeitet wird. Ist eine Vorberechnung der Heim- und Gast-Tabelle notwendig, dann kann die Datenbankview für die Gesamt-Tabelle aber weiterhin verwendet werden, sofern die Namen der Tabellen denen der Datenbankviews entsprechen.

Da meine vorgestellte Art der Verwaltung es zulässt, dass der eine Spieler mehr und der andere weniger Spiele hat, finde ich es sinnvoll, auch eine Auswertung mit Durchschnittswerten zu haben. Als Grundlage dafür greifen wir auf unsere 'standings'-Tabelle zu:

CREATE OR REPLACE VIEW standings_avg as
SELECT
    opponent_id,
    games,
    CASE WHEN games > 0 THEN round(wins/games,1) ELSE 0 END as wins,
    CASE WHEN games > 0 THEN round(draws/games,1) ELSE 0 END as draws,
    CASE WHEN games > 0 THEN round(loses/games,1) ELSE 0 END as loses,
    CASE WHEN games > 0 THEN round(goals_for/games,1) ELSE 0 END as goals_for,
    CASE WHEN games > 0 THEN round(goals_against/games,1) ELSE 0 END as goals_against,
    CASE WHEN games > 0 THEN round(points/games,1) ELSE 0 END as points
FROM standings

Mit diesen SQL-Statements haben wir nun die Grundlage für die Auswertung der Spielpaarungen geschaffen.

Um das Ganze optische auszuwerten und aufzubereiten, verwenden wir nun wieder PHP und Bootstrap. PHP um die Daten aus der Datenbank zu holen und für Bootstrap bereitzustellen.

Auf einem Desktop-Rechner kann es dann so aussehen:

ewige_tabelleavg_tabelle

Wie Ihr seht, kann man sich auch noch weitere Arten für die Tabellen überlegen, wie zum Beispiel eine Tabelle über die letzten 4 Wochen.

Da wir auch hier wieder Bootstrap genutzt haben, ist es nun ein Leichtes, die Tabellen für unterschiedlichen Devices zu optimieren, indem unwichtigere Informationen z.B. ausgeblendet werden.

ewige_tabelle_mobileavg_tabelle_mobile

Das war es auch schon mit der Ergebnisverwaltung. Ich hoffe meine Anregungen haben bei dem Einen oder Anderen das Interesse geweckt selber so eine kleine Ergebnisverwaltung zu erstellen. Wie Ihr seht, ist das es doch nicht so schwer, wie es auf den ersten Blick ausschaut.