簡體   English   中英

用於聯接但不在其他表中的SQL語句

[英]SQL statement for join but not in other table

我有兩個表: customermailing

+==========+  +=============+
| customer |  | mailing     |
+==========+  +=============+
| id       |  | id          |
+----------+  +-------------+
| name     |  | customer_id |
+----------+  +-------------+
              | mailing_id  |
              +-------------+

每次向客戶發送郵件時,我都會在郵件表中添加帶有該郵件ID的行。 一封郵件可以發送給多個客戶。

我希望有一個sql調用,該調用返回尚未收到特定郵件的所有客戶。 如何 ?

我正在使用mysql

select * from customer where id not in (
    select customer_id from mailing where mailing_id = @mailing_id
)
SELECT * FROM customers c
JOIN mailings m
ON c.id = m.id
WHERE NOT EXISTS (
    SELECT id
    FROM mailings i
    WHERE i.id = c.id
    GROUP BY i.id
)

就像是

Select c.ID, c.Name
From Customers C
left Join mailing m On c.id = m.customer_id
where m.customer_id is null

您所描述的稱為ANTI JOIN 通常,在SQL中用三種不同的方式來表達它:帶有子查詢的NOT IN條件,帶有相關子查詢的NOT EXISTS條件或帶有NOT NULL條件的LEFT JOIN 因此,對於您的查詢,可能性是:

SELECT *
FROM customer
WHERE id NOT IN
    ( SELECT customer_id
     FROM mailing)
SELECT *
FROM customer c
WHERE NOT EXISTS
    ( SELECT customer_id
     FROM mailing m
     WHERE m.customer_id = c.id)
SELECT *
FROM customer c
LEFT JOIN mailing m ON c.id = m.customer_id
WHERE m.customer_id IS NULL

這篇博客文章比較了MySQL 5.1的不同可能性。 根據它, LEFT JOIN / IS NULLNOT INNOT EXISTS快。
但是,您應該自己嘗試最快的一個。 這始終取決於您的數據,索引,...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM