Am 01.11.2012 15:56, schrieb Laura Schmidt:
Hier liegt der Hund begraben. Du joinst ja die Game-Tabelle
nochmal mit sich selbst. Du kannst das sehr schön nachvollziehen,
wenn du die ON-Klausel als eigenständige Abfrage ausführst und
entsprechende Werte für p.user und p.tournament einsetzt.
In deinem Fall siehst du dann ein Skalarprodukt aus den
3 Remis-Sätzen und den zwei Siegpartien, was 2*3 = 6 Sätze gibt,
denn MySQL gibt beim Join alle verfügbaren Kombinationen, die
laut der ON- und WHERE-Bedingung erstellt werden können, zurück.
MySQL erstellt zuerst die Tabelle mit allen möglichen Kombina-
tionen im Speicher und berechnet danach erst die Aggregat-
funktionen. Deine Formel (6 + 6 * 0.5 = 9) berechnet Mysql
schon richtig.
Abhilfe zu deinem Problem sind Subselects, indem du jeweils einen
COUNT(*) auf die gewonnenen und unentschiedenen Partien ausführst
und mit den Ergebnissen daraus genau so rechnest wie in deiner
Abfrage:
SELECT p.user AS idx, (
(
SELECT COUNT(*) FROM Game gw WHERE
gw.tournament=p.tournament AND
(
(gw.white=p.user AND gw.winner='W') OR
(gw.black=p.user AND gw.winner='B')
) AND
gw.status IN ('T','C')
) + (
SELECT COUNT(*) FROM Game gd WHERE
gd.tournament=p.tournament AND
(gd.white=p.user OR gd.black=p.user) AND
gd.ending IN ('D','S') AND
gd.status IN ('T','C')
)*0.5
) As points
FROM Participant p;
> game.ending IN ('D','S') = Remis/Patt
> game.status IN ('T','C') = Partie beendet/geschlossen
>
[...]
> Das Problem: Die Zahlen stimmen nicht. :-) Da, wo 0.0 steht, passt es,
> aber bei den anderen scheinen die Zahlen zu hoch / vervielfacht.
>
> Beispiel:
> Spieler 2 hat 9.0 Punkte. In Wirklichkeit hat er 3.5.
> (2 gewonnen, 3 Remis)
[...]
HTH
Christian