Verkettung mehrerer tables sum/count/group by

Hi @all,
ich habe ein Problem mit einer (für mich) etwas komplexeren SQL-Anweisung.

Bisher sieht mein SQL-Statement wie folgt aus:

SELECT u.id, u.Vorname, u.Nachname, sum( ppz.punkte ) as punktesumme, count( uz.platz ) as turnieranzahl, count(uzPlatziert.platz) as platziert , count(uzSiege.platz)
FROM user u, platz_punkte ppz, user_turnier_zuordnung uz , turniere t, user_turnier_zuordnung uzPlatziert , user_turnier_zuordnung uzSiege
WHERE u.id = uz.user_id
AND uz.platz = ppz.platz
AND uzPlatziert.user_id = u.id and uzPlatziert.platz>0 AND uzPlatziert.platz

Hallo,

auf jeden Fall sollte dein GROUP BY über alle nicht-Gruppen-Elemente gehen:

GROUP BY u.id, u.Vorname, u.Nachname

Den JOIN kannst du mit der Ansi-Syntax lesbarer machen:

tabelle1 INNER JOIN tabelle2 ON tabelle1.attribut = tabelle2.attribut

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Huhu,

Du muss zuerst noch nach einigen Attributen Guppieren:

SELECT u.id
 ,u.Vorname
 ,u.Nachname
 ,sum( ppz.punkte ) as punktesumme
 ,count( uz.platz ) as turnieranzahl
 ,count(uzPlatziert.platz) as platziert 
 ,count(uzSiege.platz) 
FROM user u
 ,platz\_punkte ppz
 ,user\_turnier\_zuordnung uz 
 ,turniere t
 ,user\_turnier\_zuordnung uzPlatziert 
 ,user\_turnier\_zuordnung uzSiege 
WHERE u.id = uz.user\_id
AND uz.platz = ppz.platz 
AND uzPlatziert.user\_id = u.id and uzPlatziert.platz\>0 AND uzPlatziert.platz 

Ansonsten müssen Tabellen, die keinen (äquivalenten) Datensatz enthalten mit einem Outerjoin behandelt werden. 

Man kann es aber auch mit SUB-Selects realisieren. Hier mal mein Vorschlag (ob alle Verknüpfungen stimmen... ka) : 



    
    SELECT u.id
     ,u.Vorname
     ,u.Nachname
     ,(SELECT SUM(ppz.punkte) 
     FROM platz\_punkte ppz
     ,turniere t 
     ,user\_turnier\_zuordnung uz
     WHERE uz.platz = ppz.platz 
     AND u.id = uz.user\_id
     AND uz.turnier\_id = t.id 
     AND t.datum 0 
     AND uzPlatziert.platz 
    
    Gruß
    Andreas

Hmm, also wenn brauch ich da auf jeden Fall n outer join, oder?
Weil User is quasi der master und die werte der zuordnungstabelle sollen angezeigt werden, wenn verfügbar. aber wenn nicht, muss der datensatz zu dem benutzer ja trotzdem erscheinen… nur halt ohne werte bei siege etc…

aber ich bin oracle-verwöhnt (also für outer join einfach n „(+)“ hinters where un gut…)

subselects und so… alles kein ding … unter oracle. Aber mein MySQL findet im Subselect die Tabellen des Hauptselectes nicht mehr…

Fehler „Unknown table u …“

hab die vorschläge eben mal probiert. mit der Ansi-Syntax komm ich nit klar :frowning: und die subselects klappen aus oben beschriebenem Grund nicht.

(Oder bin ich nur zu blöd?)

Danke schon mal für die rasche Hilfe!!!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

noch als erweiterung… hier mein versuch des outer joins mit dem gemeldeten SQL-Fehler

SQL-Befehl: Dokumentation

SELECT u.id, u.Vorname, u.Nachname, sum( ppz.punkte ) AS punktesumme, count( uz.platz ) AS turnieranzahl, count( uzPlatzierung.platz ) AS platzierungen
FROM user u, platz_punkte AS ppz, user_turnier_zuordnung AS uz
FULL OUTER JOIN user_turnier_zuordnung AS uzPlatzierung ON ( uzPlatzierung.user_id = u.id
AND uzPlatzierung.platz >0
AND uzPlatzierung [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]