2011-12-05 18 views
14

Tengo algunas tablas donde obtengo los correos electrónicos. Y no quiero recibir los correos electrónicos en la tabla tbl_unsubscribe. Escribí la consulta como:¿Operador MINUS en MySQL?

SELECT cand_email FROM tbl_cand_data 
UNION 
SELECT emp_email FROM tbl_emp_data 
UNION 
SELECT email FROM tbl_uptade_list 
UNION 
SELECT feed_email FROM tbl_feedback 
UNION 
SELECT admin_email FROM tbl_admin_emails  

Pero aparece un error de sintaxis. ¿El operador MINUS no es válido para MySQL?

+0

posible duplicado de [MENOS en MySQL?] (http://stackoverflow.com/questions/184592/minus-in-mysql) – geoffspear

+1

¿Le gustaría señalar el SQL en la pregunta es válido en MySQL. Tampoco hay "MENOS" en el SQL, pero la pregunta es sobre MENOS (que MySQL no admite como se explica a continuación) que es bastante confuso ... – spinkus

Respuesta

23

A NOT IN() subconsulta se puede utilizar aquí, ya que MySQL no es compatible con MINUS.

SELECT 
    cand_email 
FROM tbl_cand_data 
WHERE can_email NOT IN (SELECT un_email FROM tbl_unsubscribe) 

También se puede hacer con un LEFT JOIN, en busca de valores NULL en la columna de la un_email:

SELECT cand_email 
FROM 
    tbl_cand_data 
    LEFT JOIN tbl_unsubscribe ON tbl_cand_data.can_email = tbl_unsubscribe.un_email 
WHERE tbl_unsubscribe.un_email IS NULL 

excluirlos de un montón de UNION operaciones, envolver el grupo UNION en () como una subconsulta :

SELECT email FROM (
    SELECT cand_email AS email FROM tbl_cand_data 
    UNION 
    SELECT emp_email AS email FROM tbl_emp_data 
    UNION 
    SELECT email FROM AS email tbl_uptade_list 
    UNION 
    SELECT feed_email AS email FROM tbl_feedback 
    UNION 
    SELECT admin_email AS email FROM tbl_admin_emails 
) email_list 
WHERE email NOT IN (SELECT un_email FROM tbl_unsubscribe) 
+0

Gracias Micheal ... – AssamGuy

+0

¿Qué sucede si tengo operaciones JOIN antes? actualizar – AssamGuy

+0

@AssamGuy Ver la adición anterior. –

6

Desafortunadamente MINUS e INTERSECT no son compatibles con MySQL, pero puede obtener el mismo resultado usando join (por menos; Unión por intersecan)

SELECT cand_email FROM tbl_cand_data 
LEFT JOIN tbl_unsubscribe ON (cand_email = un_email) 
WHERE un_email IS NULL 
+0

Gracias Darhazer. Lo usaré – AssamGuy

+0

+1 Terminaste la versión JOIN antes de terminar de agregarla a la mía. –

+0

Esta es una buena solución. El uso de IN/NOT IN con una subconsulta es excesivamente lento debido a un error de MySQL 5 (http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql/ 3417190 # 3417190) – therin