2012-06-10 13 views
24

Nie mogę chyba tego rozgryźć. Próbuję połączyć dwie tabele i wybrać tylko wiersze w tabeli A, które nie mają pasującej kolumny w tabeli B. Załóżmy na przykład, że mamy tabelę użytkowników i wysłaną tabelę.MySQL wybierz wiersze, które nie mają pasującą kolumnę w innej tabeli

users tabela zawiera następujące kolumny: id, username
sent tabela ma następujące kolumny: id, username

Chcę wybrać wszystkie wiersze z users gdzie username nie istnieje w sent tabeli. Tak więc, jeśli tom jest w users i sent, nie zostanie wybrany. Jeśli jest w users, ale nie w sent, zostanie wybrany. Próbowałem tego, ale to nie działa w ogóle:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

Odpowiedz

12

Spróbuj SQL:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

Lepszym sposobem moim zdaniem byłoby:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

Ponieważ oba pola id, byłyby indeksowane (klucz podstawowy musiałbym myśl) tak to zapytanie byłoby lepiej zoptymalizowane niż pierwsze, które zasugerowałem.

Jednak moja pierwsza sugestia może ci się lepiej przydać, zależy to od wymagań Twojej aplikacji.

+0

przez niektóre inna pomoc Znalazłem to również: SELECT * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL – xendi

53

Zazwyczaj należy użyć NOT EXISTS na tego typu zapytania

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

Alternatywą byłoby użyć LEFT OUTER JOIN i sprawdzić NULL

SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

Należy zauważyć, że niejawna składnia łączenia, której używasz, jest uważana za przestarzałą i powinna zostać zastąpiona jawnym złączeniem.

-3

Może być to jeden może pomóc ....

miałem również ten sam problem, ale to rozwiązać za pomocą tej kwerendy

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

nadzieję, że ten jeden rozwiąże problemu

Powiązane problemy