Fabian: effektive MYSQL Abfrage von 3 (n) verschachtelten Tabellen

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

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

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

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

      1. Hallo Fabian,

        leider hat die Abfrage nicht funktioniert.

        Was heisst "funktioniert nicht"
        -kommt eine Fehlermeldung (wenn ja welche)
        -oder bleibt die Abfrage leer

        Paul