ti-enxame.com

Operador menos no MySQL?

Eu tenho algumas tabelas onde estou recebendo os emails. E não quero receber os emails na tabela tbl_unsubscribe. Eu escrevi a consulta como:

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    

Mas estou recebendo um erro de sintaxe. O operador MINUS não é válido para o MySQL?

15
AssamGuy

Uma subconsulta NOT IN() pode ser usada aqui, já que o MySQL não suporta MINUS.

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

Isso também pode ser feito com um LEFT JOIN, procurando NULLs no un_email coluna:

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

Para excluí-los de várias operações UNION, agrupe o grupo UNION em () como uma 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)
23
Michael Berkowski

Infelizmente, MINUS e INTERSECT não são suportados pelo MySQL, mas você pode obter o mesmo resultado usando join (para menos; union para interseção)

SELECT cand_email FROM tbl_cand_data
LEFT JOIN tbl_unsubscribe ON (cand_email = un_email)
WHERE un_email IS NULL
6
Maxim Krizhanovsky