2011-01-03 15 views
19

Quiero ponerme en contacto con mis usuarios por correo electrónico utilizando mi base de datos. Quiero asegurarme de que no me comunique accidentalmente con el mismo usuario dos veces. Para eso, tengo una tabla que rastrea quién se contactó y cuándo.mysql opuesto a la combinación interna

Cuando hago mi consulta MYSQL quiero seleccionar correos electrónicos de la tabla email y me aseguro de que ninguna de esas entradas exista en la tabla contacted.

Para decirlo en una frase: seleccione correo electrónico de Email_Table si no están en Contacted_Table

Tal vez hay un enfoque completamente diferente. Estoy abierto a todas las sugerencias:) Gracias :)

Respuesta

25
select email 
from Email_Table t1 
where not exists (select email 
        from Contacted_table t2 
        where t1.email = t2.email) 

O

select email 
from Email_Table t1 
where email not in (select email 
        from Contacted_table) 
+0

¿Cuál es la mejor manera de agregar condición a la primera declaración? como: no hay entradas de una fecha en particular (donde t1.email = t2.email Y t2.date = 2011-01-01) por alguna razón no funciona para mí – salmane

+1

¿Cuál es la forma más eficiente; 'LEFT JOIN' con dónde o esto, tu respuesta? – aksu

+0

Creo que eso depende, revise su plan de ejecución y véalo en acción. –

10

Si se intenta hacer una combinación izquierda de esta manera:

SELECT users.email, contacted.email 
FROM users LEFT JOIN contacted ON users.email = contacted.email 

obtendrá un resultado similar:

users.email | contacted.email 
----------------------------- 
[email protected] | [email protected] 
[email protected] | [email protected] 
[email protected] | [email protected] 
[email protected] | NULL 
[email protected] | NULL 

Su objetivo es conseguir que las personas, que no tiene un partido en la tabla puesto en contacto, por lo que la consulta sería:

SELECT users.email 
FROM users LEFT JOIN contacted ON users.email = contacted.email 
WHERE contacted.email IS NULL 
+3

NULL no es igual a NULL, usar 'DONDE ES contacted.email null' lugar – Lennart

+0

@Lennart gracias! ¡Estaba cometiendo ese error! – Uri

26

probar este

SELECT email FROM email_table e 
LEFT JOIN contacted_table c ON e.email = c.email 
WHERE c.email IS NULL 
+3

+1. También podría haber escrito 'USING (email)'. Lo hace aún más legible. –

+0

Contactado_table tendría una columna de fecha, así que podría recibir el correo electrónico de un correo anterior. Solo quiero asegurarme de que no tenga ese correo electrónico en una fecha determinada ... así que esencialmente necesito agregar otra condición en la "tabla contactada". Cúal seria la mejor manera? – salmane

+0

Esta es una solución fantástica que tardó 5 minutos en entender. – felwithe

Cuestiones relacionadas