Join mit mehreren Fremdschlüsseln auf eine Tabelle

daft075

Grünschnabel
Hi Leute,

Ich kenne diese Seite schon ziemlich lange, und habe sehr oft sachen gefunden die mir weiter geholfen haben.
Danke ! :)
Aber diesmal habe ich ein (für mich) echt kompliziertes Problem.

Eigentlich bin ich ein freestyler was PHP codes angeht.
Hab alles irgendwie aus dem Internet gelehrnt. Damit will ich nur sagen das ich kein super Coder bin oder so.

Nun zum Problem.

Ich habe mehrere Tabellen die ich mit einer abfrage über JOIN anspreche. Und es funktioniert alles wunderbar.
Aber in der JOIN abfrage habe ich auch eine Tabelle die mehrere (4) fremdschlüsseln einer anderen Tabelle enhält.
Jetzt habe ich mir überlegt, entweder lasse ich es so wie es ist, kann aber nur mit einem fremdschlüssel arbeiten, oder ich mach eine Kreuztabelle.
Gedacht getan.
Am Ergebnis hat sich aber nichts geändert. Bekomme auch nur ein statt 4 einträge.

Jetzt zu meiner Frage.

Wenn ich ohne Kreuztabelle arbeite, wie spreche ich die anderen fremdschlüsseln an ****?
Und wenn ich mit Kt arbeite, ... eigentlich stelt sich die gleiche Frage. Wie spreche ich diese an ****?

PHP:
$abfrage_produktion = mysql_query("SELECT * FROM $tb_beitrag 
								LEFT JOIN $tb_prod_beitrag_kt 
								ON $tb_beitrag.beitrag_id = $tb_prod_beitrag_kt.beitrag_f_id
								LEFT JOIN $tb_dreh_beitr_kt 
								ON $tb_beitrag.beitrag_id = $tb_dreh_beitr_kt.beitrag_f_id
								LEFT JOIN $tb_beitr_schnitt_kt 
								ON $tb_beitrag.beitrag_id = $tb_beitr_schnitt_kt.beitrag_f_id
								LEFT JOIN $tb_schnitt 
								ON $tb_beitr_schnitt_kt.schnitt_f_id = $tb_schnitt.schnitt_id
								LEFT JOIN $tb_schnittplatz 
								ON $tb_schnitt.schnittplatz_f_id = $tb_schnittplatz.sp_id
								LEFT JOIN $tb_dreh 
								ON $tb_dreh_beitr_kt.dreh_f_id = $tb_dreh.dreh_id
								LEFT JOIN $tb_kfz 
								ON $tb_dreh.kfz_f_id = $tb_kfz.kfz_id
								LEFT JOIN $tb_produktion 
								ON $tb_produktion.produktion_id = $tb_prod_beitrag_kt.produktion_f_id
								LEFT JOIN $tb_personal 
								ON $tb_produktion.personal_kamera_f_id = $tb_personal.personal_id
								LEFT JOIN $tb_pers_funkt_kt 
								ON $tb_personal.personal_id = $tb_pers_funkt_kt.personal_f_id
								LEFT JOIN $tb_funktion 
								ON $tb_pers_funkt_kt.funktion_f_id = $tb_funktion.funktion_id");

das wäre die Abfrage ohne KT
Wobei, mir fehlen noch andere FS, die ich nicht eingetragen habe weil sonst die Abfrage nicht funktionieren würde.
Die Betreffenden tabellen wären $tb_dreh und $tb_personal.

PHP:
$abfrage_produktion = mysql_query("SELECT * FROM $tb_dreh 
						  LEFT JOIN $tb_dreh_schnitt_kt 
						  ON $tb_dreh.dreh_id = $tb_dreh_schnitt_kt.dreh_f_id
						  LEFT JOIN $tb_personal_dreh_kt
						  ON $tb_personal_dreh_kt.pd_dreh_f_id = $tb_dreh.dreh_id
						  LEFT JOIN $tb_personal
						  ON $tb_personal.personal_id = $tb_personal_dreh_kt.pd_personal_f_id
						  LEFT JOIN $tb_kfz 
						  ON $tb_dreh.kfz_f_id = $tb_kfz.kfz_id
						  LEFT JOIN $tb_schnitt 
						  ON $tb_dreh_schnitt_kt.schnitt_f_id = $tb_schnitt.schnitt_id
						  LEFT JOIN $tb_schnittplatz
						  ON $tb_schnitt.schnittplatz_f_id = $tb_schnittplatz.sp_id
						  LEFT JOIN $tb_beitr_schnitt_kt 
						  ON $tb_schnitt.schnitt_id = $tb_beitr_schnitt_kt.schnitt_f_id
						  LEFT JOIN $tb_beitrag
						  ON $tb_beitr_schnitt_kt.beitrag_f_id = $tb_beitrag.beitrag_id 
						  LEFT JOIN $tb_event
						  ON $tb_event.event_id = $tb_dreh.event_f_id");


Das wäre der Code mit KT.
Hier Betreffenden Tabelen sind $tb_dreh, $tb_personal, und $tb_personal_dreh_kt

Bin für jede Hilfe dankbar.
 
Hast du mal ein Duagram dass die Zusammenhänge aufzeigt? Dann versteh ich ev. den mit abkürzungen überfüllten Text und auch was du unter Kreuztabelle verstehst.

Schreib auch welche Tabelle die mit den 4 Schlüsseln ist und zu welchen Tabellen diese dann gehören.

PS: Aliase auf die Tabellennamen verhindern zuviele PHP-Variablen innerhalb des SQLs
SQL:
SELECT 
	* 
FROM 
	{$tb_dreh} AS d
	LEFT JOIN {$tb_dreh_schnitt_kt} AS dskt
		ON d.dreh_id = dskt.dreh_f_id
	LEFT JOIN {$tb_personal_dreh_kt} AS pdkt
		ON pdkt.pd_dreh_f_id = d.dreh_id
	LEFT JOIN {$tb_personal} AS p
		ON p.personal_id = pdkt.pd_personal_f_id
	LEFT JOIN {$tb_kfz} AS kfz
		ON d.kfz_f_id = kfz.kfz_id
	LEFT JOIN {$tb_schnitt} AS s
		ON dskt.schnitt_f_id = s.schnitt_id
	LEFT JOIN {$tb_schnittplatz} AS sp
		ON s.schnittplatz_f_id = sp.sp_id
	LEFT JOIN {$tb_beitr_schnitt_kt}  AS bskt
		ON s.schnitt_id = bskt.schnitt_f_id
	LEFT JOIN {$tb_beitrag} AS b
		ON bskt.beitrag_f_id = b.beitrag_id 
	LEFT JOIN {$tb_event} AS e
		ON e.event_id = d.event_f_id
 
Zuletzt bearbeitet von einem Moderator:
Diagramm bild habe ich hier

Das problem ist, ich bin mir einfach nicht sicher wie das zu lösen ist.
Nicht nur Code seitig, sondern auch Tabellen seitig.
Vileicht muss ich das noch mehr zerlegen. :rolleyes:

Mit Kreuztabellen meine ich Tabelle die man für eine m:n beziehhung braucht (zwischentabelle oder wie man sie halt nennt).
Was Aliase angeht, da gebe ich dir volkommen recht. Nur mich verwirren diese irgend wie und deswegen verwende ich sie kaum.

Und danke für schnelle Antwort :)

Eigentlich könnte die Abfrage so lauten
(ich beschrenke mich jetzt nur auf die Tabellen die mir Probleme machen)

SQL:
SELECT 
* 
FROM
DREH
LEFT JOIN personal as kamera
ON dreh.kamera_f_id = kamera.personal_id
LEFT JOIN personal as redakteur
ON dreh.redakteur_f_id = redakteur.personal_f_id
LEFT JOIN personal as ton
ON dreh.ton_f_id = ton.personal_f_id
.
.
.

Dann stellt sich aber die Frage, wie spreche ich bei der auswertung (in der while schleife) diese Aliase an ********?
 
Zuletzt bearbeitet von einem Moderator:
Ah, jetzt versteh ich. Du hast die Tabelle PERSONAL einmal. Aber du hast in der Tabelle DREH vier Felder die auf PERSONAL zugreiffen.

Falls das Bild aus der DB erstellt wurde, solltest du die Verknüpfung DREH-PERSONAL ändern. Die Tabelle PERSONAL müsste 4 mal auftauchen und je eine Verbindung haben.

Das SQL für die Verknüpfungen DREH-PERSONAL würde dann etwa so aussehen
SQL:
SELECT
	dreh.*,
	redakteur.personal_name AS redakteur_name,
	regie.personal_name AS regie_name,
	kamera.personal_name AS kamera_name,
	ton.personal_name AS ton_name	
FROM
	dreh
	LEFT JOIN personal AS redakteur
		ON dreh.redakteur_f_id = redakteur.personal_id
	LEFT JOIN personal AS regie
		ON dreh.regie_f_id = regie.personal_id
	LEFT JOIN personal AS kamera
		ON dreh.kamera_f_id = kamera.personal_id
	LEFT JOIN personal AS ton
		ON dreh.kamera_f_id = ton.personal_id
 
Zuletzt bearbeitet von einem Moderator:
Das habe ich mir gedacht.
Nur der ursprunglicher gedanke war folgender.
Ich wollte unbedingt nur eine PERSONAL Tabelle haben, da ich unser Personal verwaltung so pflegen wollte.

Danke für deine Hilfe.
 
Du hast so nur eine Personal-Tabelle. Alle vier Beziehungen greiffen auf dieselbe Tabelle zu - aber nicht gleichzeitig.

Sind die Beziehungen in der DB definiert oder hast du sie nur in der Grafik so? Im 2ten Fal ist alles bestens.
 
Die Beziehungen sind in der DB nicht definiert. Ich dacht das macht man eben mit der JOIN anweisung. :rolleyes:
Die Grafik habe ich mit Navicat test version gemacht.
War auch für mich einfacher zu verstehen und kontrolieren.
 
Zurück