2011-12-05 12 views
14

私は電子メールを受け取っているテーブルをいくつか持っています。そして、私はテーブルtbl_unsubscribeの電子メールを取得したくありません。MySQLのMINUS演算子ですか?

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

NOT IN()サブクエリはここで使用できます。これは、MySQLがMINUSをサポートしていないためです。

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

またun_email列内のNULLを探して、LEFT JOINで行うことができます。

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

Thanks Micheal ... – AssamGuy

+0

私は以前にJOIN操作をしていましたか?アップデート – AssamGuy

+0

@AssamGuy上記の追加を参照してください。 –

6

残念ながら、MINUSとINTERSECTはMySQLではサポートされていませんが、 joinを使って同じ結果を得る(マイナスの場合;交差のための連合)

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

ダーハザーさんありがとうございました。私はそれを使用します – AssamGuy

+0

+1私は私にそれを追加し終える前にJOINのバージョンを完了しました。 –

+0

これは良い解決策です。サブクエリでIN/NOT INを使用すると、MySQL 5バグのために非常に遅くなります(http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql/ 3417190#3417190) – therin

関連する問題