eisbaersche: SQL über 3 Tabellen mittels Join (mysql-db)

Beitrag lesen

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:

  1. 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

  2. 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)

  3. 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!