2009-07-04 5 views
0

J'ai donc posé quelques questions sur l'exécution de jointures et j'ai eu de bonnes réponses, mais il y a toujours quelque chose qui me dérange complètement.les jointures de mysql me rendent fou!

J'ai 3 tables. Appelons-les table-b, table-d et table-e.
Les tables-b et table-d partagent une colonne appelée p-id.
Les tables-e et table-b partagent une colonne appelée ev-id.
La table-e a également une colonne appelée date.
La table-b possède également une colonne id unique appelée u-id.

Je voudrais écrire une requête qui retourne u-id dans les conditions suivantes:
1) Restriction à une certaine valeur dans table-e.date.
2) Où table-b.p-id ne correspond pas à table-d.p-id.

Je pense que j'ai besoin de jointure interne table-b et et table-e sur la colonne e-id. Je pense alors que je dois effectuer une jointure gauche sur table-d et et table-b où p-id est nul.
Mon problème est que je ne connais pas la syntaxe de l'écriture de cette requête. Je sais écrire plusieurs jointures internes et je sais écrire une jointure à gauche. Comment puis-je combiner les deux?

Merci beaucoup à tous ceux qui m'aident. Je suis (évidemment!) Un débutant dans les bases de données et j'ai du mal à comprendre!

+0

S'il vous plaît afficher les deux requêtes partielles - il nous aide si vous montrez ce que vous J'ai essayé jusqu'ici. –

+0

Êtes-vous sûr de la condition 2? par exemple. si vous avez p-id de 2, 3, 4 dans les tables b et d, vous voulez que 2 dans b correspondent 3 et 4 dans d, 3 dans b pour correspondre 2 et 4 dans d, et 4 dans b pour correspondre à 2 et 3 dans b? aussi, voulez-vous que null dans b corresponde à null dans d? –

+0

Je ne peux pas poster les requêtes partielles car je ne les ai pas écrites pour cet exemple. Je voulais juste dire que je connais la syntaxe générique pour effectuer des jointures. – musoNic80

Répondre

0

Je pense qu'il est quelque chose comme ceci:

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) Vous avez oublié la table-e.date = XXX condition 2) Je trouve cela plus clair que celui de @Alex mais je crois que mysql fonctionnerait plus lentement si table-d contient plusieurs lignes (même si la sous-sélection ne sera exécutée qu'une seule fois) – daremon

3

Vous écrivez juste le joint un après l'autre:

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