Nico R.: MySQL: Erweiterte Abfrage - Sollte/darf man das so tun?

Beitrag lesen

Hallo zusammen,

ich habe festgestellt, dass die SQL-Abfrage aus meinem letzten Beitrag noch zu unpräzise ist. Ich erhalte ja aktuell die Gesamtstatistik eines Spielers aus einer Saison.

Nun kann es allerdings in einer Saison fünf verschiedene Wettbewerbstypen (Liga, Landespokal, DFB-Pokal, Testspiel, Relegation) geben. Ich möchte gerne pro Saison die jeweiligen Gesamtsummen für diese Wettbewerbe erhalten.

Ich könnte nun meine bestehende SQL-Abfrage entsprechend erweitern, die liefert im Test auch schon die korrekten Daten. Dabei entsteht allerdings ein ziemliches Monstrum an Abfrage. Ich habe meine Zweifel, ob man das so tun sollte. Hier die erweiterte Abfrage mit zwei verschiedenen Wettbewerbstypen (eigentlich sind es wie gesagt fünf):

SELECT 		
	saison_spieler.saison_id,
	saison_spieler.nr,
	saison_spieler.pos,
	saison.name,
	saison.jahr,
    liga.einsaetze, liga.eingew, liga.ausgew, liga.spielzeit, liga.tore, liga.vorlagen, liga.gelb, liga.gelb_rot, liga.rot,
    pokal.einsaetze, pokal.eingew, pokal.ausgew, pokal.spielzeit, pokal.tore, pokal.vorlagen, pokal.gelb, pokal.gelb_rot, pokal.rot    
FROM 
	`saison_spieler`
JOIN
	`saison`
    ON saison.id = saison_spieler.saison_id
JOIN
	(SELECT 
     	spieltag.saison_id,
		COUNT(spielerstatistik.spieler_id) AS einsaetze,
		COUNT(spielerstatistik.eingew) AS eingew,
		COUNT(spielerstatistik.ausgew) AS ausgew,
		SUM(spielerstatistik.spielzeit) AS spielzeit,
		SUM(spielerstatistik.tore) AS tore,
		SUM(spielerstatistik.vorlagen) AS vorlagen,
		COUNT(spielerstatistik.gelb) AS gelb,
		COUNT(spielerstatistik.gelb_rot) AS gelb_rot,
		COUNT(spielerstatistik.rot) AS rot
    FROM
    	spielerstatistik 
    JOIN
    	spieltag
        ON spieltag.id = spielerstatistik.spieltag_id
    WHERE 
		spielerstatistik.spieler_id = 12 AND spieltag.wettbewerb = 1
	GROUP BY
		saison_id     
    ) AS liga    
    ON liga.saison_id = saison_spieler.saison_id
JOIN
	(SELECT 
     	spieltag.saison_id,
		COUNT(spielerstatistik.spieler_id) AS einsaetze,
		COUNT(spielerstatistik.eingew) AS eingew,
		COUNT(spielerstatistik.ausgew) AS ausgew,
		SUM(spielerstatistik.spielzeit) AS spielzeit,
		SUM(spielerstatistik.tore) AS tore,
		SUM(spielerstatistik.vorlagen) AS vorlagen,
		COUNT(spielerstatistik.gelb) AS gelb,
		COUNT(spielerstatistik.gelb_rot) AS gelb_rot,
		COUNT(spielerstatistik.rot) AS rot
    FROM
    	spielerstatistik 
    JOIN
    	spieltag
        ON spieltag.id = spielerstatistik.spieltag_id
    WHERE 
		spielerstatistik.spieler_id = 12 AND spieltag.wettbewerb = 2
	GROUP BY
		saison_id     
    ) AS pokal    
    ON pokal.saison_id = saison_spieler.saison_id    
WHERE
	saison_spieler.spieler_id = 12

Offenbar ist das prinzipiell für MySQL keine große Herausforderung. Ich bekomme in phpmyadmin die Auskunft "Die Abfrage dauerte 0,0000 Sekunden". Aber dennoch frage ich ja fünfmal die gleiche Art von Daten ab. In PHP kann ich die Erstellung des Querys in eine Funktion packen und somit Redundanzen vermeiden. Sollte/könnte ich das auch in SQL tun? Bewegt sich der Query noch einem "normalen" Rahmen? Ich hatte so etwas bisher noch nicht.

Schöne Grüße

Nico