2012-04-12 22 views
19

Si tengocláusula WHERE ANTES DE INNER JOIN

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

¿Funciona WHERE cláusula después de las dos tablas son JOINED?

¿Cómo lo hago para que funcione antes de JOIN?

+0

Las respuestas dadas son correctas, pero vale la pena ahondar un poco más. ¿Por qué estás buscando este comportamiento? Me imagino que el optimizador de consultas manejaría el caso obvio para usted ... –

Respuesta

19

Cambiar el WHERE a otro JOIN condición

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

0

que puede hacer

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

La cláusula where se ejecutará antes de la join de modo que no se une a los registros innecesarios. Entonces su código está bien de la manera que es.

+4

¿alguien más puede confirmarlo? – user1124535

+3

@ user1124535 Puedo confirmarlo. Ejecute la consulta 'explain' y verá. –

+2

Esto debería recibir más votos positivos –

0

En mi experiencia en una combinación de la izquierda, no puede excluir registros en la tabla 'izquierda' (t1) en la declaración ON dado que, por definición, se incluirán todos los registros t1. La sentencia where funciona, ya que se aplicará al resultado de la unión después.

No sé exactamente lo que quiere lograr, pero lo más probable es que una unión interna se adapte a sus necesidades y luego puede agregar la condición t1.user = 'bob' a la declaración ON.

Pero si Mosty Mostacho es correcto, la ubicación (WHERE vs ON) de la condición no es relevante para la velocidad de ejecución.

0

RIGHT JOIN era la solución:

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 

no han puesto a través de todo el rigor aún, pero parece que funciona.