effektive MYSQL Abfrage von 3 (n) verschachtelten Tabellen
Fabian
- datenbank
0 Paul Brunner
Hallo Forum Gemeinde,
leider konnte mir im Archiv und handbuch nicht geholfen werden, so dass ich mein Problem einmal hier posten werde. Für eine Antwort wäre ich sehr dankbar.
Meine Datenbank besteht aus drei Tabellen.
Tabelle_A Tabelle_B Tabelle_C
-stellen_id -stellen_id -ordner_id
-text1 -ordner_id -unternehmen_id
-text2
-text3
Ich würde gern alle Spalten der Tabelle A ausgeben, wenn in Tabelle_C $ordner_id = ordner_id AND $unternehmen_id = unternehmen_id
Meine Versuche mit JOIN Abfragen...
und verschachtelten WHERE Bedingungen:
$sql = "SELECT text1, text2 FROM Tabelle_A
WHERE (
Tabelle_C.unternehmen_id ='$unternehmen_id'
AND Tabelle_C.ordner_id ='$ordner_id'
AND Tabelle_B.ordner_id = Tabelle_C.ordner_id
AND Tabelle_A.stellen_id = Tabelle_B.stellen_id)";
...sind leider gescheitert.
Das Problem habe ich nun mit einer doppelten WHILE Schleife lösen können:
$result = mysql_query("SELECT stellen_id FROM TABELLE X INNER JOIN TABELLE X ON (Tabelle X.ordner_id = Tabelle X.ordner_id) WHERE (Tabelle X.uid ='$UID' AND Tabelle X.ordner_id='$s_ordner_id')");
while ($row = mysql_fetch_array($result))
{ $stellen_id=$row["stellen_id"];
$sql= mysql_query("SELECT TABELLE X.text1, text2, text3 FROM Tabelle X WHERE stellen_id='$stellen_id'");
while ($row = mysql_fetch_array($sql))
{
$text1=$row["text1"];
$text2=$row["text2"];
$text3=$row["text3"];
}
echo $text1...
}
Diese Lösung funktioniert zwar, erscheint mir aber wenig praktikabel und uneffektiv.
Ich habe Tabellen mit mehreren tausend Datensätzen. Hierzu wären soweit ich das richtig verstanden habe, die Join Abfragen am effektivsten.
Wie muß diese jedoch aussehen? Für drei Tabellen (bzw. auch gern für n-Tabellen)?
Vielen Dank für deine Unterstützung
Grüße aus Braunschweig
Fabian
Hallo Fabian,
Meine Datenbank besteht aus drei Tabellen.
Tabelle_A Tabelle_B Tabelle_C
-stellen_id -stellen_id -ordner_id
-text1 -ordner_id -unternehmen_id
Ich würde gern alle Spalten der Tabelle A ausgeben, wenn in Tabelle_C $ordner_id = ordner_id AND $unternehmen_id = unternehmen_id
und verschachtelten WHERE Bedingungen:
$sql = "SELECT text1, text2 FROM Tabelle_A
WHERE (
Tabelle_C.unternehmen_id ='$unternehmen_id'
AND Tabelle_C.ordner_id ='$ordner_id'
AND Tabelle_B.ordner_id = Tabelle_C.ordner_id
AND Tabelle_A.stellen_id = Tabelle_B.stellen_id)";
Ob deine JOIN-Klausel korrekt verschachtelt ist kann ich leider nicht sehen, aber deine WHERE-Klausel enthält zuviele Bedingungen. Die letzten beiden Bedingungen sind durch die JOIN-Klausel bereits erfüllt.
So sollte es gehen:
SELECT Tabelle_A.*
FROM Tabelle_C INNER JOIN (Tabelle_A INNER JOIN Tabelle_B ON Tabelle_A.stellen_id = Tabelle_B.stellen_id) ON Tabelle_C.ordner_id = Tabelle_B.ordner_id
WHERE (((Tabelle_B.unternehmen_id)='$unternehmen_id') AND ((Tabelle_C.ordner_id)='$ordner_id'));
Achte auf die korrekte Verschachtelung der JOINS in den Klammern von innen nach außen (Tabellen von rechts nach links).
Noch eine Tip: Der Übersichtlichkeit wegen solltest du die verknüpften Felder zweier Tabellen nicht gleich benennen. Also nicht "tabellen_b.ordner_id -> tabellen_c.ordner_id" sondern besser "tabellen_b.ordner_id -> tabellen_c.ordner_rel" damit sind die Felder auch unterscheidber ohne Tabellenangabe und die Richtung der Beziehung wird klar.
Gruß
Paul
Hallo Paul,
vielen Dank, für deine ausführliche Lösung.
Ich denke damit werde ich es nun wirklich schaffen.
Vielen Dank auf für deinen Tipp.
Du hattest recht, meine Joins habe ich wegen dem Durcheinander kaum verstanden.
Dann werde ich mich mal an die Umsetzung machen...
Grüße aus Branschweig
Fabian
Hallo Paul,
leider hat die Abfrage nicht funktioniert. Ich habe diverse Korrekturen vorgenommen, es geht aber trotzdem nicht bei mir.
Könntest du deine Löung evtl. noch einmal kurz auf Fehler durchsehen. Falls Sie dennoch richtig ist, muß der Fehler ja auf meiner Seite liegen.
Danke im Voraus
Fabian
Meine Datenbank besteht aus drei Tabellen.
Tabelle_A Tabelle_B Tabelle_C
-stellen_id -stellen_id -ordner_id
-text1 -ordner_id -unternehmen_id
Ich würde gern alle Spalten der Tabelle A ausgeben, wenn in Tabelle_C $ordner_id = ordner_id AND $unternehmen_id = unternehmen_id
So sollte es gehen:
Select A.* from Tabelle_C?...oder from Tabelle A?
..WHERE (((Tabelle_B.unternehmen_id)?... oder Tabelle_C?
SELECT Tabelle_A.*
FROM Tabelle_C INNER JOIN (Tabelle_A INNER JOIN Tabelle_B ON Tabelle_A.stellen_id = Tabelle_B.stellen_id) ON Tabelle_C.ordner_id = Tabelle_B.ordner_id
WHERE (((Tabelle_B.unternehmen_id)='$unternehmen_id') AND ((Tabelle_C.ordner_id)='$ordner_id'));
Hallo Fabian,
leider hat die Abfrage nicht funktioniert.
Was heisst "funktioniert nicht"
-kommt eine Fehlermeldung (wenn ja welche)
-oder bleibt die Abfrage leer
Paul