web-dev-qa-db-fra.com

Clause WHERE avant INNER JOIN

Si j'ai

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.id = t2.id 
WHERE t1.user='bob';

La clause WHERE est-elle exécutée après les deux tables sont-elles JOINED

Comment puis-je le faire pour qu'il fonctionne avant le JOIN? 

23
user1124535

Remplacez la variable WHERE par une autre condition JOIN

LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'

22
hkf

La clause where sera exécutée avant la join afin de ne pas joindre les enregistrements inutiles. Donc, votre code est bien tel qu'il est.

72
Mosty Mostacho

D'après mon expérience dans une jointure gauche, vous ne pouvez pas exclure des enregistrements de la table 'left' (t1) de l'instruction ON car, par définition, tous les enregistrements t1 seront inclus. L'instruction where fonctionne, car elle sera appliquée au résultat de la jointure par la suite.

Je ne sais pas exactement ce que vous souhaitez réaliser, mais très probablement une jointure interne convient également à vos besoins, puis vous pouvez / ajouter la condition t1.user = 'bob' à l'instruction ON.

Mais si Mosty Mostacho est correct, l'emplacement (WHERE vs ON) de la condition n'est pas pertinent pour la rapidité d'exécution.

2
tihe

RIGHT JOIN était la solution: 

SELECT cars.manufacturer, cars.year FROM cars 
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq 
ON cars.manufacturer=subq.manufacturer

Je n'ai pas encore passé le cap, mais cela semble fonctionner.

0
user2782001

tu peux faire

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2
        ON t1.id=t2.id AND t1.user='bob';
0
g3rv4

Vous devriez simplement ajouter la condition t1.user='bob' à la clause ON avant une autre condition, qui sera évaluée en premier:

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;
0
Ivan Olshansky