GROUP BY funktioniert nicht

Hattrix

Erfahrenes Mitglied
Hallo,

Beispiel:
http://www.hattrix-online.de/neu/index2.php?action=turniere&zahl=2

SQL:
SELECT name, SUM(
IF (
vote_h > vote_g, 1, 0
) ) AS win, SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS remis, SUM(
IF (
vote_h < vote_g, 1, 0
) ) AS lost, SUM( vote_h ) AS t1, SUM( vote_g ) , (
SUM( vote_h ) - SUM( vote_g )
) AS diff, SUM(
IF (
vote_h > vote_g, 3, 0
) ) + SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS pkt, logo
FROM sl_turnier
INNER JOIN sl_vereine ON sl_turnier.heim = sl_vereine.id_v
WHERE spieltag <= '".$spielta."'
AND saison = '".$saison."'
GROUP BY name
UNION
SELECT name, SUM(
IF (
vote_h < vote_g, 1, 0
) ) AS win, SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS remis, SUM(
IF (
vote_h > vote_g, 1, 0
) ) AS lost, SUM( vote_g ) AS t1, SUM( vote_h ) , (
SUM( vote_g ) - SUM( vote_h )
) AS diff, SUM(
IF (
vote_h < vote_g, 3, 0
) ) + SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS pkt, logo
FROM sl_turnier
INNER JOIN sl_vereine ON sl_turnier.gast = sl_vereine.id_v
WHERE spieltag <= '".$spielta."'
AND saison = '".$saison."'
GROUP BY name
ORDER BY pkt DESC , diff DESC , t1 DESC , name ASC

Hier sieht man, dass die Vereine mehrmals auftauchen, anstatt, das sie nur einmal auftauchen und alles ordentlich addiert wird!

Wo ist mein Fehler? Kann mir evtl. jemand helfen?
 
Ach du je. Wie willst du bei soviel in einer Abfrage überhaupt den Überblick behalten. Da ist es doch wirklich sinnvoll das ganze in Views oder Stored Procedures aufzuteilen oder?
 
SQL:
SELECT DISTINCT(`name`), SUM(
IF (
vote_h > vote_g, 1, 0
) ) AS win, SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS remis, SUM(
IF (
vote_h < vote_g, 1, 0
) ) AS lost, SUM( vote_h ) AS t1, SUM( vote_g ) , (
SUM( vote_h ) - SUM( vote_g )
) AS diff, SUM(
IF (
vote_h > vote_g, 3, 0
) ) + SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS pkt, logo
FROM sl_turnier
INNER JOIN sl_vereine ON sl_turnier.heim = sl_vereine.id_v
WHERE spieltag <= '".$spielta."'
AND saison = '".$saison."'
GROUP BY name
UNION
SELECT name, SUM(
IF (
vote_h < vote_g, 1, 0
) ) AS win, SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS remis, SUM(
IF (
vote_h > vote_g, 1, 0
) ) AS lost, SUM( vote_g ) AS t1, SUM( vote_h ) , (
SUM( vote_g ) - SUM( vote_h )
) AS diff, SUM(
IF (
vote_h < vote_g, 3, 0
) ) + SUM(
IF (
vote_h = vote_g, 1, 0
) ) AS pkt, logo
FROM sl_turnier
INNER JOIN sl_vereine ON sl_turnier.gast = sl_vereine.id_v
WHERE spieltag <= '".$spielta."'
AND saison = '".$saison."'
GROUP BY name
ORDER BY pkt DESC , diff DESC , t1 DESC , name ASC

Wenn das nicht klappt, dann musst du dein Query überarbeiten, denn es mutet grausam an ;)
Siehe zejas Kommentar.
 
Moin Hattrix,

ich verstehe Dein Erstaunen nur begrenzt - Dein GROUP BY funktioniert doch (entgegen der Überschrift) genau wie eingegeben. Works as designed sozusagen.
Wenn du die Schnörkel weglässt, sagst Du doch in Deinem Statement

Mach ein GROUP BY name auf meine sl_vereine-Tabelle (nimm aber nur die heim-vereine)
und stelle da drunter (=UNION)
ein GROUP BY name auf meine sl_vereine-Tabelle (nimm aber nur die gast-vereine)
Wenn also im ersten Teil 10 Sätze rauskommen und im zweiten auch 10, hast Du 20 Datensätze - wen wunderts?
Auf das Gesamt-Resultset machst Du ja kein GROUP BY mehr.
Versuche es so [ungetestet]:
SQL:
Select name, Sum(win) as win, Sum(remis) as remis, 
       sum(lost) as lost,
       Sum(t1) as t1, Sum(vote_g) as vote_g, 
       sum(diff) as diff, sum(pkt) as pkt, logo
From (       
SELECT name, 
IF (vote_h > vote_g, 1, 0)  AS win, 
IF (vote_h = vote_g, 1, 0)  AS remis, 
IF (vote_h < vote_g, 1, 0)  AS lost, 
 vote_h  AS t1, 
 vote_g  , 
vote_h  - vote_g  AS diff, 
IF (vote_h > vote_g, 3, 0)  + IF (vote_h = vote_g, 1, 0)  AS pkt, 
logo 
FROM sl_turnier 
        INNER JOIN sl_vereine ON sl_turnier.heim = sl_vereine.id_v
  WHERE spieltag <= '".$spielta."'
  AND saison = '".$saison."'

UNION All

SELECT name, 
IF (vote_h < vote_g, 1, 0)  AS win, 
IF (vote_h = vote_g, 1, 0)  AS remis, 
IF (vote_h > vote_g, 1, 0)  AS lost, 
vote_g  AS t1, 
vote_h  , 
 vote_g  - vote_h  AS diff, 
IF (vote_h < vote_g, 3, 0)  + IF (vote_h = vote_g, 1, 0)  AS pkt,  
logo 
FROM sl_turnier 
INNER JOIN sl_vereine ON sl_turnier.gast = sl_vereine.id_v
WHERE spieltag <= '".$spielta."'
AND saison = '".$saison."'

)
GROUP BY name

ORDER BY 
pkt DESC , 
diff DESC , 
t1 DESC , 
name ASC

Hier gibt es nur _EIN_ GROUP BY und dieses bezieht sich auf den gesamten ResultSet.

Grüße
Biber
 
Zuletzt bearbeitet von einem Moderator:
Zurück