Оператор MINUS в MySQL?

У меня есть несколько таблиц, где я получаю письма. И я не хочу получать электронные письма в таблице tbl_unsubscribe. Я написал запрос как:

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    

Но я получаю синтаксическую ошибку. Является ли оператор MINUS недействительным для MySQL?

Ответы

Ответ 1

A NOT IN() можно использовать подзапрос, поскольку MySQL не поддерживает MINUS.

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

Это также можно сделать с помощью LEFT JOIN, ища NULL в столбце 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

Чтобы исключить их из группы операций UNION, оберните группу UNION в () в качестве подзапроса:

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)

Ответ 2

К сожалению, MINUS и INTERSECT не поддерживаются MySQL, но вы можете получить тот же результат, используя join (для minus; union для пересечения)

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