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)