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
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.
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.
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
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