Подтвердить что ты не робот

MySQL выбирает строки, которые не имеют соответствующего столбца в другой таблице

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

Таблица

users имеет следующие столбцы: id, username
Таблица sent имеет следующие столбцы: id, username

Я хочу выбрать все строки из users, где username не существует в таблице sent. Итак, если tom находится в users, а в sent он не будет выбран. Если он находится в users, но не в sent, он будет выбран. Я пробовал это, но он не работал вообще:

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

Ответ 1

Попробуйте этот SQL:

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

На мой взгляд, лучший способ:

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

Как и поля id, будет проиндексирован (первичный ключ, о котором я подумал бы), поэтому этот запрос будет лучше оптимизирован, чем первый, который я предложил.

Однако вы можете найти мое первое предложение лучше для вас, это зависит от ваших требований к вашему приложению.

Ответ 2

Обычно для этого типа запроса NOT EXISTS используется NOT EXISTS

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

Альтернативой может быть использование LEFT OUTER JOIN и проверка на NULL

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

Обратите внимание, что синтаксис неявного соединения, который вы используете, считается устаревшим и должен быть заменен явным соединением.

Ответ 3

Может быть, это может помочь вам....

У меня была такая же проблема, но я решил использовать этот запрос

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

надеюсь, что это решит вашу проблему.