MySQL wybierz wiersze, które nie mają pasujących kolumn w innej tabeli

Na razie nie mogę 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. na przykład, załóżmy, że mamy tabelę users i tabelę sent.

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

Chcę wybrać wszystkie wiersze z users Gdzie username nie istnieje w sent tabeli. Więc jeśli tom jest w users i w sent nie będzie wybrane. Jeśli jest w users, ale nie w sent, zostanie wybrany. Próbowałem tego, ale w ogóle nie działało:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname
Author: Brian Tompsett - 汤莱恩, 2012-06-10

3 answers

Spróbuj tego SQL:

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

Moim zdaniem lepszym sposobem 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 główny, o którym myślałem), więc zapytanie byłoby lepiej zoptymalizowane niż pierwsze, które zasugerowałem.

Jednak moja pierwsza sugestia może być dla ciebie lepsza, zależy to od twoich wymagań dotyczących aplikacji.

 25
Author: Haroon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 17:42:14

Zazwyczaj używasz NOT EXISTS do tego typu zapytań

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

Alternatywą byłoby użycie LEFT OUTER JOIN i sprawdzenie NULL

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

zauważ, że domyślna składnia join, której używasz, jest przestarzała i powinna zostać zastąpiona jawnym join.

 62
Author: Lieven Keersmaekers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-10 12:47:25

Może ten może Ci pomóc ....

Miałem również ten sam problem, ale rozwiązany za pomocą tego zapytania

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

Mam nadzieję, że ten rozwiąże twój problem

 -3
Author: Upendra Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 10:07:37