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
Ответы
Ответ 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);
надеюсь, что это решит вашу проблему.