MYSQL - выберите, только если строка в LEFT JOIN отсутствует
У меня есть две простые таблицы mysql. Первая 1 называется почтой и имеет 2 строки:
sender | receiver
Marley | Bob
Saget | Bob
Второй блок называется block и имеет 1 строку:
blocker | blocked
Bob | Marley
Я хочу выбрать отправителя (ов) из первой таблицы, которая отправила письма Боба, но не заблокирована в таблице блоков. Таким образом, результаты должны быть:
sender
saget
Я попробовал следующий запрос, но не возвращал результаты:
SELECT * FROM mail
LEFT JOIN block ON (block.blocker = 'Bob')
WHERE (block.blocked <> mail.sender)
Ответы
Ответ 1
Левое соединение создаст строки null
для несоответствий.
Это те строки null
, которые необходимо фильтровать.
SELECT * FROM mail
LEFT JOIN block ON (block.blocker = 'Bob')
WHERE block.blocker IS NULL
Это как бы удушение, связанное с фиксированным значением, однако, более общее соединение (учитывая ваши таблицы) было бы следующим:
SELECT * FROM mail
LEFT JOIN block ON (block.blocker = mail.receiver
and block.blocked = mail.sender)<<-- these should match
WHERE block.blocker IS NULL <<-- select only mismatches
AND mail.receiver like 'bob';
Ответ 2
Попробуйте следующее:
SELECT sender
FROM mail m
WHERE NOT EXISTS (SELECT 1 FROM block
WHERE blocker = m.receiver
AND blocked = m.sender)