2011-12-05 121 views
14

我有一些表格,我收到的電子郵件。我不希望收到表tbl_unsubscribe中的電子郵件。我寫了這樣的查詢:MINUS在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  

但我得到一個語法錯誤。 MINUS運算符對MySQL無效嗎?

+0

可能重複[在MySQL MINUS?](http://stackoverflow.com/questions/184592/minus-in-mysql) – geoffspear

+1

想在一個問題,指出SQL它在MySQL中是有效的。在SQL中也沒有「MINUS」,但問題是關於MINUS(MySQL不支持下面討論的),這是相當混亂的... – spinkus

回答

23

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做,尋找在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) 
+0

謝謝Micheal ... – AssamGuy

+0

如果我之前有JOIN操作,該怎麼辦?更新 – AssamGuy

+0

@AssamGuy查看上面的內容。 –

6

不幸的是,MySQL不支持MINUS和INTERSECT,但是你可以使用連接獲得相同的結果(用於減號;對於相交集)的

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

謝謝Darhazer。我將使用它 – AssamGuy

+0

+1在添加完成之前,您完成了JOIN版本。 –

+0

這是一個很好的解決方案。由於MySQL 5的bug,在子查詢中使用IN/NOT IN非常緩慢(http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql/ 3417190#3417190) – therin