2011-12-05 62 views
14

Tôi có một số bảng nơi tôi nhận được email. Và tôi không muốn nhận email trong bảng tbl_unsubscribe. Tôi đã viết truy vấn như:MINUS toán tử trong 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  

Nhưng tôi nhận được lỗi cú pháp. Nhà điều hành MINUS có hợp lệ cho MySQL không?

+0

thể trùng lặp của [TRỪ trong MySQL?] (http://stackoverflow.com/questions/184592/minus-in-mysql) – geoffspear

+1

có muốn chỉ ra những SQL trong câu hỏi như nó đứng là hợp lệ trong MySQL. Cũng không có "TRỪ" trong SQL, nhưng câu hỏi là về MINUS (mà MySQL không hỗ trợ như được thảo luận dưới đây) mà là khá khó hiểu ... – spinkus

Trả lời

23

Một truy vấn con NOT IN() có thể được sử dụng tại đây, vì MySQL không hỗ trợ MINUS.

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

Nó cũng có thể được thực hiện với một LEFT JOIN, tìm kiếm NULLs trong un_email cột:

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 

Để loại trừ chúng từ một loạt các UNION hoạt động, quấn nhóm UNION trong () như một subquery :

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

Cảm ơn Micheal ... – AssamGuy

+0

Điều gì sẽ xảy ra nếu tôi có các hoạt động JOIN trước đây? cập nhật – AssamGuy

+0

@AssamGuy Xem thêm ở trên. –

6

Thật không may MINUS và INTERSECT không được MySQL hỗ trợ, nhưng bạn có thể nhận được kết quả tương tự bằng cách sử dụng phép nối (cho dấu trừ; công đoàn cho giao nhau)

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

Cảm ơn Darhazer. Tôi sẽ sử dụng nó – AssamGuy

+0

+1 Bạn đã hoàn thành phiên bản JOIN trước khi tôi hoàn thành việc thêm nó vào của tôi. –

+0

Đây là một giải pháp tốt. Sử dụng IN/NOT IN với truy vấn phụ là cực kỳ chậm do lỗi của MySQL 5 (http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql/ 3417190 # 3417190) – therin