2011-01-03 23 views
19

Chcę skontaktować się z moimi użytkownikami za pośrednictwem poczty e-mail za pomocą mojej bazy danych. Chcę się upewnić, że przypadkowo nie skontaktuję się z tym samym użytkownikiem dwa razy. Do tego mam tabelę, która śledzi, z kim się kontaktowałem i kiedy.mysql naprzeciwko wewnętrznego łączenia

Kiedy wykonuję moje zapytanie MYSQL, chcę wybrać e-maile z tabeli email i upewnić się, że żaden z tych wpisów nie istnieje w tabeli contacted.

Aby wyrażenie go w zdaniu: wybierz e-mail od Email_Table jeśli nie są one w Contacted_Table

Być może jest to zupełnie inne podejście. Jestem otwarty na wszelkie sugestie:) Dziękuję :)

Odpowiedz

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

LUB

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

jaki jest najlepszy sposób na dodanie warunku do pierwszego stwierdzenia? na przykład: brak wpisów z konkretnej daty (gdzie t1.email = t2.email I t2.date = 2011-01-01) z jakiegoś powodu nie działa dla mnie – salmane

+1

Który jest najbardziej efektywny; 'LEFT JOIN' z tym, gdzie lub to, twoja odpowiedź? – aksu

+0

Myślę, że to zależy, sprawdź plan wykonania i zobacz go w akcji. –

10

Jeśli spróbujesz zrobić LEFT JOIN tak:

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

Dostaniesz podobny wynik:

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

Twój cel jest, aby ci, którzy nie mają mecz w kontaktuje tabeli, więc zapytanie będzie:

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

NULL nie jest równe NULL, należy użyć 'GDZIE JEST NULL' contacted.email zamiast – Lennart

+0

@Lennart dzięki! Robiłem ten błąd! – Uri

26

Spróbuj

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

+1. Możesz napisać również "USING (e-mail)". Sprawia, że ​​jest jeszcze bardziej czytelny. –

+0

W tabeli Contacted_table znajdowałaby się kolumna z datą, dzięki której mógłbym otrzymać wiadomość e-mail z poprzedniego mailingu. Chcę tylko upewnić się, że nie ma tego e-maila w konkretnej dacie ... tak zasadniczo muszę dodać kolejny warunek na "contacted_table". Jaki byłby najlepszy sposób? – salmane

+0

To fantastyczne rozwiązanie, które zajęło mi 5 minut. – felwithe

Powiązane problemy