2009-07-04 13 views
0

Also habe ich ein paar Fragen zu Joins gestellt und gute Antworten gefunden, aber es gibt immer noch etwas, worüber ich komplett stolpere.mysql Joins machen mich verrückt!

Ich habe 3 Tabellen. Nennen wir sie Tabelle-b, Tabelle-d und Tabelle-e.
Tabelle-b und Tabelle-d teilen eine Spalte namens p-id.
Tabelle-e und Tabelle-b teilen eine Spalte namens ev-id.
Tabelle-e hat auch eine Spalte namens date.
Tabelle-b hat auch eine eindeutige ID-Spalte namens U-ID.

Ich möchte eine Abfrage schreiben, die u-ID unter den folgenden Bedingungen zurück:
1) auf einen bestimmten Wert in table-e.date Restriced.
2) Wo table-b.p-id nicht mit der Tabelle-d.p-id übereinstimmt.

Ich denke, ich brauche innere Verbindung Tabelle-b und und Tabelle-e auf der E-ID-Spalte. Ich denke dann, dass ich einen linken Join auf Tabelle-d und und Tabelle-b ausführen muss, wo p-id null ist.
Mein Problem ist, dass ich die Syntax des Schreibens dieser Abfrage nicht kenne. Ich weiß, wie man mehrere innere Verbindungen schreibt und ich weiß, wie man eine linke Verbindung schreibt. Wie kombiniere ich die beiden?

Vielen Dank an alle, die mir helfen. Ich bin (offensichtlich!) Ein Neuling in Datenbanken und kämpfe darum, alles zu verstehen!

+0

die beiden Teilabfragen Bitte schreiben - es hilft uns, wenn Ihnen zeigen, was Sie habe es bisher versucht. –

+0

Sind Sie sich sicher, Bedingung 2? z.B. Wenn Sie p-id von 2, 3, 4 in Tabelle b und d haben, möchten Sie 2 in b 3 und 4 in d, 3 in b zu 2 und 4 in d und 4 in b zu 2 und 3 in b? Willst du auch, dass null in b null in d entspricht? –

+0

Ich kann die Teilabfragen nicht veröffentlichen, weil ich sie nicht für dieses Beispiel geschrieben habe. Ich meinte nur, ich kenne die generische Syntax zum Ausführen von Joins. – musoNic80

Antwort

0

Ich denke, es ist etwas wie folgt aus:

SELECT uid 
    FROM table-b 
    INNER JOIN table-e 
     ON table-b.ev_id = table-e.ev_id 
    WHERE table-b.p_id NOT IN (SELECT p_id from table-d) 
+0

1) Du hast die table-e.date = XXX Bedingung vergessen 2) Ich finde diese klarer als die von @Alex, aber ich glaube, dass mysql das langsamer laufen würde wenn Tabelle-d viele Zeilen hat (obwohl der Subselect nur einmal ausgeführt wird) – daremon

3

Sie schreiben nur die einer nach dem anderen verbindet:

SELECT b.uid 
    FROM b 
    INNER JOIN e USING(evid) 
    LEFT JOIN d USING(pid) 
    WHERE e.date = :whatever 
    AND d.pid IS NULL