[英]SQL statement for join but not in other table
我有兩個表: customer
和mailing
:
+==========+ +=============+
| 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 NULL
和NOT IN
比NOT EXISTS
快。
但是,您應該自己嘗試最快的一個。 這始終取決於您的數據,索引,...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.