Hallo zusammen,
ich bin derzeit an der Erstellung einer Internetseite für unsere wöchentliches Bundesliga-Tippspiel um mich auch mal in PHP und SQL wieder reinzufuchsen...
Nun bin ich aber auf ein kleines problem gestoßen und bräuchte eure hilfe bei einem SQL-Statement, ob dies mit einem RIGHT/LEFT join möglich ist.
Ich habe 3 Tabellen mit folgenden Strukturen:
-
Users (für die Spieler)
--------------------------
+UserID(int, Primary Key)
+UserName(varchar)
+aktiv(aktiv) -> dient für spätere Historie um auch Saisonübergreifend Tipps von Spielern beizubehalten -
spieltag (für die Speicherung der wirklichen Partien und deren Ergebnisse)
------------------------------------------------------------------------------
+ID (int, Primary Key)
+Heim (int, Fremdschlüssel zur TeamID einer anderen Tabelle)
+Gast (int, Fremdschlüssel zur TeamID einer anderen Tabelle)
+ToreHeim (int)
+ToreGast (int)
+spieltag (int) -
spieltagtippen (Hier sind die tipps der Spieler)
----------------------------------------------------
- IDSpieler(int, Primary Key)
- IDSpiel(int, Primary Key)
- TippToreHeim (int)
- TippToreGast (int)
- spieltag (int)
Für die Auswertung habe ich nun folgendes vor:
----------------------------------------------
Ich möchte, um es später für die Darstellung in PHP einfacher zu haben, der Datenbank die Arbeit überlassen.
Ziel ist es, dass ich Alle Spiele eines Spieltages mit sämtlichen Tipps mir darstellen lasse, auch von denen, die nicht getippt haben (deise sind auch nicht in der tabelle spieltagtippen enthalten)!
Mit dem SQL-Statement:
SELECT ID, Heim, Gast, ToreHeim, ToreGast, UserID, UserName
FROM `spieltag`
CROSS JOIN users
WHERE aktiv = true
AND spieltag =1
ORDER BY UserID ASC , ID ASC
bekomme ich dann folgendes Ergebnis:
Alle Spiele eines Spieltages |Jeder Nutzer (auswahl User 2)
---------------------------------------------------|---------------------------
ID Heim Gast ToreHeim ToreGast | UserID UserName
33 75 51 NULL NULL | 2 daniel
34 56 66 NULL NULL | 2 daniel
35 54 57 NULL NULL | 2 daniel
36 64 63 NULL NULL | 2 daniel
37 59 69 NULL NULL | 2 daniel
38 67 58 NULL NULL | 2 daniel <-Spiel 38 nicht getippt(siehe unten)
39 76 60 NULL NULL | 2 daniel
40 78 77 NULL NULL | 2 daniel
41 62 65 NULL NULL | 2 daniel
diese daten (auch das nicht getippte spiel 38) möchte ich mit den folgenden daten aus der tabelle 'spieltagtippen' (hier ist ein spieler mehr, der spiel 38 getippt hat) kombinieren:
IDSpieler IDSpiel TippToreHeim TippToreGast Spieltag
--------------------------------------------------------------------------
1 39 3 3 1
1 33 9 9 1
1 35 7 7 1
1 36 6 6 1
1 40 2 2 1
1 38 4 4 1
1 37 5 5 1
1 41 1 1 1
1 34 8 8 1
2 35 3 3 1
2 34 2 2 1
2 40 8 8 1
2 36 4 4 1
2 37 5 5 1
2 41 9 9 1
2 39 7 7 1
2 33 1 1 1
Standard
Vielen Dank für die Grafik, ich hoffe sie hilft mir weiter...wenigstens mal schön übersichtlich dargestellt denke mal selber ein bisserl malen könnte helfen
[Update]
Mit einem Cross Join bekomme ich es hin, dass jeder aktive User auch mit allen Spielen eines Spieltages verbunden wird:
Code:
SELECT ID, Heim, Gast, ToreHeim, ToreGast, UserID, UserName
FROM spieltag
CROSS JOIN users
WHERE aktiv = true
AND spieltag =1
ORDER BY UserID ASC , ID ASC
LIMIT 0 , 30
das ergebnis ist folgendes:
Code:
Alle Spiele eines Spieltages |Jeder Nutzer (auswahl User 2)
---------------------------------------------------|---------------------------
ID Heim Gast ToreHeim ToreGast | UserID UserName
33 75 51 NULL NULL | 2 daniel
34 56 66 NULL NULL | 2 daniel
35 54 57 NULL NULL | 2 daniel
36 64 63 NULL NULL | 2 daniel
37 59 69 NULL NULL | 2 daniel
38 67 58 NULL NULL | 2 daniel <-Spiel 38 nicht getippt(siehe unten)
39 76 60 NULL NULL | 2 daniel
40 78 77 NULL NULL | 2 daniel
41 62 65 NULL NULL | 2 daniel
nun muss ich noch das ganze mit der dritten tabelle, den Tipps verbinden die dann eben zusätzlich dort eingebunden werden...
HIer mal die getippten Spiele zu dem Datensatz:
Code:
IDSpieler IDSpiel TippToreHeim TippToreGast Spieltag
--------------------------------------------------------------------------
1 39 3 3 1
1 33 9 9 1
1 35 7 7 1
1 36 6 6 1
1 40 2 2 1
1 38 4 4 1
1 37 5 5 1
1 41 1 1 1
1 34 8 8 1
2 35 3 3 1
2 34 2 2 1
2 40 8 8 1
2 36 4 4 1
2 37 5 5 1
2 41 9 9 1
2 39 7 7 1
2 33 1 1 1
Ich möchte nun das ergebnis oben mit diesen daten kombinieren. Die situation ist dabei folgende: Spieler 1 hat alle 9 Spiele getippt, Spieler 2 nur 8 der 9 spiele (Spiel 38 nicht).
Egal wie ich die daten kombiniere, ich bekomme es nicht hin, dass für das spiel 38 von Spieler 2 auch ein datensatz (Nämlich NULL bei den Tipps) ausgegeben wird!
danke schonmal für die Hilfe!