2013-03-20 2 views
15

У меня есть две простые таблицы mysql. Первый 1 называется почты и имеет 2 строки:MYSQL - выберите, только если строка в LEFT JOIN отсутствует

sender | receiver 
Marley | Bob 
Saget | Bob 

второй один названный блок и имеет 1 ряд:

blocker | blocked 
    Bob | Marley 

Я хочу, чтобы выбрать отправителя (ы) из первой таблицы, который послал Боба электронной почты но не блокируются в таблице блоков. Таким образом, результаты должны быть:

sender 
saget 

Я пробовал следующий запрос, но он не возвращает результаты:

SELECT * FROM mail 
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE (block.blocked <> mail.sender) 
+1

Но ' Saget' заблокирован 'Bob' – Lamak

+0

На самом деле результат не должен быть' saget', потому что вы видите, что Боб уже заблокировал их обоих. –

+0

Извините, я сделал глупую ошибку ... Марли только заблокирован, а saget не –

ответ

18

Левых присоединиться будет производить null строки для несовпадений.
Это те строки null, которые необходимо фильтровать.

SELECT * FROM mail 
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE block.blocker IS NULL 

Это своего рода задушить, чтобы присоединиться на фиксированное значение, однако, более общим Join (учитывая ваши таблицы) будет:

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'; 
+0

Вы присоединяетесь к жестко запрограммированному значению для '' Bob'' ?, и ничего больше ?. Это не кажется правильным – Lamak

+0

Easy Lamak не было сделано с ответом ... :-) и еще не сделано .... Сделано. – Johan

+0

Итак, теперь все готово ?. Я думаю, что это все еще отсутствует условие, вы также должны проверить, что отправитель заблокирован. – Lamak

9

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

SELECT sender 
FROM mail m 
WHERE NOT EXISTS (SELECT 1 FROM block 
        WHERE blocker = m.receiver 
        AND blocked = m.sender) 
+0

Вероятно, нужно добавить 'AND Receiver = 'Bob'', так как он указывает, что хочет искать сообщения от Боба. – JNK

+0

@JNK Да, я думал об этом требовании, но не решался добавить это условие, так как таблица «block» (видимо) должна иметь все блокирующие, а не только «Bob» – Lamak

+0

Спасибо Lamak :) Я сейчас пытаюсь другой запрос, вызывающий еще одну проблему с очень похожим сценарием, поэтому опубликует его в новом вопросе –