Sporttabelle auswerten

error_on

Mitglied
Meine Situation ist eigentlich recht simpel, ich habe im Prinzip 1 Tabelle nach folgendem Schema:
Code:
matchID
teama_id
teama_score
teamb_id
teamb_score
# Verkürzte Form

Nach jedem Spieltag werden die Ergebnisse eingetragen und es soll aufgrund dieser Ergebnisse eine normale Tabelle, wie man sie aus dem Sport kennt, erstellt werden.
Das Prinzip dahinter ist auch recht simpel:
teama_score>teamb_score bedeutet, TeamA erhält 2 Punkte.
teama_score=teamb_score bedeutet, TeamA und TeamB erhalten jeweils 1 Punkt
teama_score<teamb_score bedeutet, TeamB erhält 2 Punkte.

Code:
((SELECT COUNT(*) FROM spielplan WHERE teama_id=x AND teama_score > teamb_score))+((SELECT COUNT(*) FROM spielplan WHERE teamb_id=x AND teama_score < teamb_score))
#gekürzte Form (Unentschieden fehlt natürlich)
Soweit ist mein Erfolg nach ein paar Tagen bishe(
Ich müsste nun für jedes Team die Abfrage durchlaufen lassen um die Punkte zu ermitteln und habe damit noch nichtmal die Spielpunkte (Tore) ermittelt.
Jetzt wurde mir empfohlen eine zusätzliche Tabelle anzulegen, in der ich die Rangliste immer wieder speicher, d.h. nach jedem Spieltag wird ein die Rangliste um die Punkte und Tore erweitert.
Meiner Meinung nach ist das aber überflüssig, denn die Punkte die ich in die Tabelle schreibe kann ich ja mit einer Formel errechnen, weil ich die Grundlage dafür ja in der Tabelle spielplan stehen habe, außerdem habe ich so viel mehr Abfragen als nötig, was bei größeren Tabellen auch auf die Performance schlagen könnte.

Leider sind meine MySql-Fähigkeiten wirklich bescheiden und ich komme auf keinen grünen Zweig um die Abfrage für die Tabelle vllt sogar in ein Statement packen zu können.
Ich wäre für jede Hilfe dankbar was in die Richtung geht.
 
Könnte mMn so gehen
SQL:
SELECT
    -- Mit der variablen @rang den Rang hochrechnen
    @rang := @rang+1 AS rang,
    tid,
    SUM(score) AS points
FROM
    -- Die Variabl @rang initialisieren
    (SELECT @rang := 0) AS vars,
    -- Die a und b untereinander setzen mittels UNION
    (
        SELECT
            teama_id        AS tid,
            -- Punkte von Team A auswerten
            CASE
                WHEN teama_score > teamb_score THEN 2
                WHEN teama_score = teamb_score THEN 1
                ELSE 0    
            END             AS score
        FROM
            spielplan     
        UNION ALL SELECT
            teamb_id        AS tid
            -- Punkte von Team B auswerten
            CASE
                WHEN teamb_score > teama_score THEN 2
                WHEN teamb_score = teama_score THEN 1
                ELSE 0    
            END AS score
        FROM
            spielplan 
    ) AS team_score
GROUP BY
    tid
ORDER BY
    SUM(score) DESC

Den Teil mit dem @rang kann man auch weglassen.
 
Zuletzt bearbeitet von einem Moderator:
Super! Danke, das klappt wunderbar und wenn man es dann noch um die Spielpunkte bzw. Tore erweitern will, dann sieht es so aus:
SQL:
SELECT
    -- Mit der variablen @rang den Rang hochrechnen
    @rang := @rang+1 AS rang,
    tid,
    SUM(score) AS points,
	SUM(goal) AS goals
FROM
    (SELECT @rang := 0) AS vars,
    (
        SELECT
            teama_id        AS tid,
            -- Punkte von Team A auswerten
            CASE
                WHEN teama_score > teamb_score THEN 2
                WHEN teama_score = teamb_score THEN 1
                ELSE 0    
            END             AS score,
			teama_score AS goal
        FROM
            spielplan  
        UNION ALL SELECT
            teamb_id        AS tid,
            -- Punkte von Team B auswerten
            CASE
                WHEN teamb_score > teama_score THEN 2
                WHEN teamb_score = teama_score THEN 1
                ELSE 0    
            END AS score,
			teamb_score AS goal
        FROM
            spielplan
    ) AS team_score
GROUP BY
    tid
ORDER BY
    SUM(score) DESC

Gegenpunkte (Gegentore) dann natürlich analog genauso.

Ist das denn jetzt performanter als wenn ich die Rangliste immer wieder in eine Tabelle speichern würde?
 
Zuletzt bearbeitet von einem Moderator:
Ist das denn jetzt performanter als wenn ich die Rangliste immer wieder in eine Tabelle speichern würde?

Das Speichern ist wahrscheinlich perfomranter, da die Berechnungen nur nach jedem Spiel durchgeführt werden und nicht pro Anfrage. Aber bei wenig Daten kommt es nicht so drauf an.
 
Mal eine ganz dumme Frage, wenn ich den Rang des letzten Spieltags ermitteln möchte, dann macht es wohl am meisten Sinn den Rang von jedem Spieltag in der Teamtabelle zu speichern, dann abgleichen und beim nächsten Spieltag den alten Rang speichern und vergleichen, etc. oder?
 

Neue Beiträge

Zurück