2011-01-03 6 views
19

Я хочу связаться с моими пользователями по электронной почте, используя мою базу данных. Я хочу убедиться, что я случайно не свяжусь с одним и тем же пользователем дважды. Для этого у меня есть таблица, которая отслеживает, с кем связались и когда.mysql напротив внутреннего соединения

Когда я выполняю свой запрос MYSQL, я хочу выбрать электронную почту из таблицы email и убедиться, что ни одна из этих записей не существует в таблице contacted.

выражаясь в предложении: выбрать электронную почту от Email_Table, если они не находятся в Contacted_Table

Возможно, это совершенно другой подход. Я открыт для всех предложений:) Спасибо :)

ответ

25
select email 
from Email_Table t1 
where not exists (select email 
        from Contacted_table t2 
        where t1.email = t2.email) 

ИЛИ

select email 
from Email_Table t1 
where email not in (select email 
        from Contacted_table) 
+0

Каков наилучший способ добавить условие к первому выражению? например: нет записей с определенной даты (где t1.email = t2.email AND t2.date = 2011-01-01) по какой-то причине он не работает для меня – salmane

+1

Это самый эффективный способ; 'LEFT JOIN', где и что, ваш ответ? – aksu

+0

Я думаю, что это зависит, проверьте ваш план выполнения и увидите его в действии. –

10

Если вы попытаетесь сделать левый присоединиться как это:

SELECT users.email, contacted.email 
FROM users LEFT JOIN contacted ON users.email = contacted.email 

вы получите тот же результат:

users.email | contacted.email 
----------------------------- 
[email protected] | [email protected] 
[email protected] | [email protected] 
[email protected] | [email protected] 
[email protected] | NULL 
[email protected] | NULL 

Ваша цель чтобы получить те, кто не имеет матч в контакт таблицы, так что ваш запрос будет:

SELECT users.email 
FROM users LEFT JOIN contacted ON users.email = contacted.email 
WHERE contacted.email IS NULL 
+3

NULL не равен NULL, используйте 'WHERE contacted.email IS NULL' вместо – Lennart

+0

@Lennart спасибо! Я делал эту ошибку! – Uri

26

Попробуйте

SELECT email FROM email_table e 
LEFT JOIN contacted_table c ON e.email = c.email 
WHERE c.email IS NULL 
+3

+1. Вы могли бы написать 'USING (email)' тоже. Делает его еще более удобочитаемым. –

+0

Contacted_table будет иметь столбец даты, чтобы я мог иметь в нем электронную почту из предыдущей рассылки. Я просто хочу удостовериться, что у него нет этого письма на определенную дату ... поэтому по существу мне нужно добавить еще одно условие на «contacted_table». Что было бы лучше всего? – salmane

+0

Это фантастическое решение, которое заняло у меня 5 минут, чтобы обернуть мою голову. – felwithe

Смежные вопросы