Sven Rautenberg: GROUP BY mit mehreren Feldern

Beitrag lesen

Moin!

Also, das Problem ist eine Abfrage für ein Fußballtabelle. ich hab alle Spiele in einer DB:

team1 | team2 | tore1 | tore2 | saison(Jahr) | ID (team1 + team2 + saison)

jedes team spielt einmal gegen die anderen Teams. jetzt versuch ich bei der Abfrage rauszufinden, wieviel Tore hat eine Manschaft geschossen und wieviele Siege (unentschieden und niederlagen) hat sie.

Diese Informationen kannst du unmöglich alle gemeinsam in einer einzigen Abfrage ermitteln.

Ich würde sogar behaupten, dass du deine Datenstruktur für die gewählte Aufgabe sehr ungünstig gewählt hast.

Die Problematik ist folgende: Du mußt für die Ermittlung der Daten einer einzelnen Mannschaft natürlich alle ihre Spielergebnisse wissen. Also:
SELECT * FROM tabelle WHERE team1=01 or team2=01 (für Mannschaft 01).

Das bringt dir unsortiert die Spielergebnisse aller Spiele der Mannschaft.

Jetzt kannst du aber die Spielergebnisse nicht einfach über einen Kamm scheren, weil die Tore der Mannschaft ja einmal in tore1 und auch in tore2 stehen können. Du müßtest die Abfrage also im Prinzip zweiteilen:

SELECT team1, tore1 FROM tabelle WHERE team1=01
UNION
SELECT team2, tore2 FROM tabelle WHERE team2=01

Damit würdest du zuerst die Tabelle "Alle Heimtore der Mannschaft 01" erhalten, und das UNION hängt dir dann noch die Tabelle "Alle Auswärtstore der Mannschaft 01" hinten dran. Das könnte man dann vielleicht sogar gruppieren und zusammenzählen. Wenn man das Auswahlkriterium wegließe, würde sich vermutlich auch eine Gruppierung hinkriegen lassen.

Einziges KO-Kriterium: MySQL 3 kann kein UNION.

Deshalb ist es irgendwie wesentlich besser, wenn du einfach nur die Datenbank mit einer einfachen Abfrage nach allen relevanten Ergebnissen der Saison befragst und das Ergebnis dann mit deiner abfragenden Sprache zusammenzählst.

Alternativ kannst du natürlich auch eine temporäre Datenbanktabelle aufbauen, in die du schrittweise die Resultate einzelner Abfragen einträgst. Oder du machst eben einzelne DB-Abfragen, die dir nach und nach alle gewünschten Daten liefern.

Die Sache ließe sich wesentlich leichter lösen, wenn du deine Datenbank anders aufgebaut hättest!

Im Prinzip ließen sich die von dir gewünschten Daten nämlich viel einfacher herausfinden, wenn du das entscheidende Identifikationsmerkmal, nämlich die Bezeichnung der Mannschaft, in nur einer einzigen Spalte hättest.

Also ungefähr so (mit Beispieleinträgen):

Mannschaft | Spieltag | Saison | Begegnung | Heim/Gast | Tore | GUV
01           01          01       01          H           3      G
02           01          01       01          G           0      V

So würde das Spielergebnis "01 gegen 02 3:0" eingebaut werden.

Am Ende kannst du alle Spielergebnisse der Mannschaft 01 abfragen, auch nach Mannschaften gruppieren, und jeweils die Tore mit sum() zusammenzählen, und die Gewinne/Unentschieden/Verloren mit count() zählen.

Das alles noch schön getrennt nach Spieltag, Saison und Begegnung (diese Begegnungsnummer ist nur dazu da, die Spielpartner eines Spieltages zusammenzuhalten - das kann auch gern entfallen).

Merke: Oftmals kann man ein Problem leicht dadurch lösen, dass man die Datenstrukturen entsprechend optimiert. Dadurch wird es unter Umständen aber etwas aufwendiger, diese Strukturen mit Daten zu befüllen - aber da Auswertungen meist viel häufiger vorkommen, als Einfügungen, lohnt sich das Spielchen.

- Sven Rautenberg

--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|