[MySQL] 4 Tabellen miteinander verknüpfen (JOIN)?

preko

Erfahrenes Mitglied
Hi,

ich möchte 4 Tabellen miteinander verknüpfen, da ich aus diesen jeweils zur Darstellung einer Seite einzelne Datensätze benötige.

Die Tabellen sind im Prinzip wie folgt aufgebaut:

tabelle_1:
ort_id | ort_name

tabelle_2:
anbieter_id | anbieter_bezeichnung | ort_id

tabelle_3:
user_id | user_name

tabelle_4:
ort_id | anbieter_id | user_id | vertrag

Ich möchte nun die Tabellen verknüpfen, so daß ich jeweils die benötigten Daten daraus "ziehen" kann.

Ich stelle mir etwas wie das folgende vor:
PHP:
...
$id = (int) $_POST['id'];

$sql_query = "SELECT
                                 tabelle_1.ort_id AS ort_id,
                                 tabelle_1.ort_name AS ort_name,
                                 tabelle_2.anbieter_id AS anbieter_id,
                                 tabelle_2.anbieter_bezeichnung AS anbieter_bezeichnung,
                                 tabelle_2.ort_id,
                                 tabelle_3.user_id AS user_id,
                                 tabelle_3.user_name AS user_name,
                                 tabelle_4.ort_id,
                                 tabelle_4.anbieter_id,
                                 tabelle_4.user_id,
                                 tabelle_4.vertrag AS vertrag
                      FROM
                                `tabelle_4`
                      INNER JOIN
                                `tabelle_2` ON tabelle_4.anbieter_id = tabelle_2.anbieter_id
                      INNER JOIN
                                `tabelle_1` ON tabelle_4.ort_id = tabelle_1.ort_id
                      AND
                                `tabelle_3` ON tabelle_4.user_id = tabelle_3.user_id
                      WHERE
                                `status` = '1'
                      AND
                                `id` = '$id'                     
";
$result = mysql_query($sql_query);
while( $row = mysql_fetch_array($result,MQSQLASSOC) ) {

echo $row['ort_id']."<br />";
echo $row['ort_name']."<br />";
echo $row['anbieter_id']."<br />";
echo $row['anbieter_bezeichnung']."<br />";
echo $row['user_id']."<br />";
echo $row['user_name']."<br />";
echo $row['vertrag']."<br />"
}
...
Leider bekomme ich die Meldung:
Warning: mysql_fetch_array(): supplied argument ist not a valid MySQL result resource in D:\nur\ein\projekt.php on line 100

Jetzt nun die Königsfrage:

wo liegt mein Fehler, oder besser gesagt, wie kann man es lösen?


Beste Grüße,
preko
 
Probiers mal so und wenn das nicht geht vielleicht mal mit einem LEFT JOIN.

PHP:
$sql_query = "SELECT
                                 tabelle_1.ort_id AS ort_id,
                                 tabelle_1.ort_name AS ort_name,
                                 tabelle_2.anbieter_id AS anbieter_id,
                                 tabelle_2.anbieter_bezeichnung AS anbieter_bezeichnung,
                                 tabelle_2.ort_id,
                                 tabelle_3.user_id AS user_id,
                                 tabelle_3.user_name AS user_name,
                                 tabelle_4.ort_id,
                                 tabelle_4.anbieter_id,
                                 tabelle_4.user_id,
                                 tabelle_4.vertrag AS vertrag
                      FROM ((
                                `tabelle_4`
                      INNER JOIN
                                `tabelle_2` ON tabelle_4.anbieter_id = tabelle_2.anbieter_id )
                      INNER JOIN
                                `tabelle_1` ON tabelle_4.ort_id = tabelle_1.ort_id )
                      INNER JOIN
                                `tabelle_3` ON tabelle_4.user_id = tabelle_3.user_id 
                      WHERE
                                `status` = '1'
                      AND
                                `id` = '$id'                     
";

Und vielleicht solltest du die einzelnen Felder nicht gleich benennen.
 
Zuletzt bearbeitet:
Hallo,
wenn ich richtig liege vergleichst du eine Spalte id mit der übergebenen Variable $id:
Code:
AND `id` = '$id'
Problem hierbei ist, dass diese Spalte nirgends in der eigentlichen Abfrage auftaucht.
Es müsste beispielsweise so aussehen:
Code:
AND `ort_id` = '$id'
In der WHERE Clausel fragst du nach status, aber in welcher Tabelle steht der Status?

Die Folge daraus ist, dass es immer kein Ergebnis gibt bzw. zu einer Fehlermeldung kommt.
 
@aGeNET:

vielen Dank für die schnelle Antwort. Sorry, in der Eile sind mir die Sachen durchgegangen. :eek:

Es müsste wie folgt lauten:
PHP:
... 
$id = (int) $_POST['id']; 

$sql_query = "SELECT 
                                 tabelle_1.ort_id AS ort_id, 
                                 tabelle_1.ort_name AS ort_name, 
                                 tabelle_1.status AS status,
                                 tabelle_2.anbieter_id AS anbieter_id, 
                                 tabelle_2.anbieter_bezeichnung AS anbieter_bezeichnung, 
                                 tabelle_2.ort_id, 
                                 tabelle_3.user_id AS user_id, 
                                 tabelle_3.user_name AS user_name, 
                                 tabelle_4.ort_id, 
                                 tabelle_4.anbieter_id, 
                                 tabelle_4.user_id, 
                                 tabelle_4.vertrag AS vertrag 
                      FROM 
                                `tabelle_4` 
                      INNER JOIN 
                                `tabelle_2` ON tabelle_4.anbieter_id = tabelle_2.anbieter_id 
                      INNER JOIN 
                                `tabelle_1` ON tabelle_4.ort_id = tabelle_1.ort_id 
                      AND 
                                `tabelle_3` ON tabelle_4.user_id = tabelle_3.user_id 
                      WHERE 
                                `status` = '1' 
                      AND 
                                `ort_id` = '$id'                      
"; 
$result = mysql_query($sql_query); 
while( $row = mysql_fetch_array($result,MQSQLASSOC) ) { 

echo $row['ort_id']."<br />"; 
echo $row['ort_name']."<br />"; 
echo $row['anbieter_id']."<br />"; 
echo $row['anbieter_bezeichnung']."<br />"; 
echo $row['user_id']."<br />"; 
echo $row['user_name']."<br />"; 
echo $row['vertrag']."<br />" 
} 
...

@ CraisiePrinzZ:
habe beide Vorschläge von Dir leider erfolglos versucht. Da ist immer noch irgendein Wurm drin, der sich hartnäckig vor mir versteckt! :(


Beste Grüße,
preko
 
Moin preko,

kann aber auch viel banaler sein...
Code:
                      INNER JOIN  
                                `tabelle_2` ON tabelle_4.anbieter_id = tabelle_2.anbieter_id  
                      INNER JOIN  
                                `tabelle_1` ON tabelle_4.ort_id = tabelle_1.ort_id  
                      AND  
                                `tabelle_3` ON tabelle_4.user_id = tabelle_3.user_id

Der erste INNER JOIN... okay.
Der zweite...ist wo genau zu Ende? Nach ".... ort_id" ?
Und was soll das nach dem "AND" sein? Doch eher eine "WHERE"-Bedingung.
Dann gehört es aber ein paar Zeilen tiefer mit dazu.

Grüße
Biber
 
Zuletzt bearbeitet:
Hab vielleicht noch was gefunden:

Welchen Typ hat denn die Status Spalte in Tabelle1?

Wenns eine Integer Spalte ist, dann musst du die Hochkommas um die 1 entfernen:
Code:
WHERE status = 1
 
Zuletzt bearbeitet:
H Biber2,

Code:
                      // 1. JOIN
                      INNER JOIN  
                                `tabelle_2` ON tabelle_4.anbieter_id = tabelle_2.anbieter_id  

                      // 2. JOIN
                      INNER JOIN  
                                `tabelle_1` ON tabelle_4.ort_id = tabelle_1.ort_id  

                      // Weiterführung des 2. INNER JOIN (bzw. 3. JOIN) - Keine WHERE Bedingung!
                      AND  
                                `tabelle_3` ON tabelle_4.user_id = tabelle_3.user_id

Der erste INNER JOIN... okay.
Der zweite...ist wo genau zu Ende? Nach ".... ort_id" ? Richtig!
Und was soll das nach dem "AND" sein? Doch eher eine "WHERE"-Bedingung. Falsch! Das AND soll sozusagen die "Ergänzung" des 2. INNER JOIN sein, da ich ja 4 Tabellen miteinander verknüpfen möchte. Das Beispiel soll nur meine Idee verdeutlichen und erhebt keinen Anspruch auf Richtigkeit. ;)
...

@ olgs:
Die Spalte "Status" ist eine vom Typ "Integer".


Beste Grüße,
preko
 
Zuletzt bearbeitet:
Code:
SELECT
	tabelle_1.ort_id AS ort_id,
	tabelle_1.ort_name AS ort_name,
	tabelle_2.anbieter_id AS anbieter_id,
	tabelle_2.anbieter_bezeichnung AS anbieter_bezeichnung,
	tabelle_2.ort_id,
	tabelle_3.user_id AS user_id,
	tabelle_3.user_name AS user_name,
	tabelle_4.ort_id,
	tabelle_4.anbieter_id,
	tabelle_4.user_id,
	tabelle_4.vertrag AS vertrag
	FROM
		`tabelle_4`	
			INNER JOIN	`tabelle_2` ON (tabelle_4.anbieter_id = tabelle_2.anbieter_id)
			INNER JOIN	`tabelle_1` ON (tabelle_4.ort_id = tabelle_1.ort_id)
			INNER JOIN	`tabelle_3` ON (tabelle_4.user_id = tabelle_3.user_id)
			WHERE	`status` = '1'	AND	`id` = '$id'

versuchs so
 
@ dummdidummoei:

leider funktioniert es nicht. Der letzte der drei INNER JOIN macht die Probleme. Nehme ich diesen heraus, kriege ich eine, wenn auch unvollständige Darstellung, da ja einige Daten nicht vorhanden sind, die aus der dritten Abfrage kämen.

Sobald der dritte INNER JOIN wieder reingesetzt wird, kommt erneut die Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument ist not a valid MySQL result resource in D:\nur\ein\projekt.php on line ....

Gibt es vielleicht irgendwie eine Limitierung auf 2 INNER JOIN Anweisungen, die an mir vorbeigegangen ist? :confused:


Beste Grüße,
preko
 
Ich nochma,

Das ganze mal ohne JOIN, ist zwar nicht so schön, aber leichter zu überschauen
PHP:
SELECT * FROM `tabelle_1`, `tabelle_2`, `tabelle_3`, `tabelle_4`
WHERE `tabelle_4.anbieter_id` = `tabelle_2.anbieter_id`
AND `tabelle_4.ort_id` = `tabelle_1.ort_id`
AND `tabelle_4.user_id` = `tabelle_3.user_id`
AND `tabelle_4.ort_id` = '$id'
AND `tabelle_4.status` = '1' 
/* bzw `tabelle_4.status` = 1 // nicht vergessen, beim `status` die genaue Tabelle anzugeben. ich nehme mal an es ist die 4. */


Nur noch ein kleiner Rat:
Versuch dir anzugewöhnen, die Tabellen und deren Felder besser auseinanderzuhalten.
Das Ganze geht relativ einfach, in dem du den Tabellen eindeutige Namen gibst und in der jeweiligen Tabelle jedes Feld mit dem Tabellenname beginnst.

Bsp:
Code:
tabelle_1 -> orte
-------------------------
ort_id | ort_name


tabelle_2 -> anbieter
------------------------------
anbieter_id | anbieter_name | anbieter_ort


tabelle_3 -> user
-------------------------
user_id | user_name ( | user_ort)

tabelle_4 -> vertrag
-------------------------
vertrag_id | vertrag_anbieter_id | vertrag_user_id | vetrag_beschreibung | vertrag_status

Kannst dich ja auch noch besser in das Normalisierung einarbeiten, es erleichtert die Arbeit mit Datenbanken ungemein.
mfg
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück