2013-03-20 7 views
15

Mam 2 proste tabele mysql. Pierwszy 1 nazywany elektronicznej i ma 2 rzędy:MYSQL - Wybierz tylko jeśli wiersz w LEWYM DOŁĄCZU nie jest obecny

sender | receiver 
Marley | Bob 
Saget | Bob 

drugi zwany blok i ma 1 wiersz:

blocker | blocked 
    Bob | Marley 

Chcę wybrać nadawcę (ów) z pierwszej tabeli, która wysłała Bob maile ale nie są zablokowane w tabeli bloków. Więc wyniki powinny być:

sender 
saget 

Próbowałem następującą kwerendę, ale to nie zwracania wyników:

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

Ale ' Saget' jest zablokowany przez 'Bob''a – Lamak

+0

W rzeczywistości wynik nie powinien być' saget', ponieważ widzisz, Bob już zablokował oba. –

+0

Przepraszam, popełniłem głupi błąd ... marley jest zablokowany tylko podczas saget nie –

Odpowiedz

18

Lewa przyłączyć będzie produkować null wiersze dla niedopasowań.
To te wiersze, które należy filtrować.

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

to niby udusić do łączenia na stałej wartości jednak bardziej powszechne join (podane tabele) byłoby:

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

Dołączasz do zakodowanej wartości dla ''Bob'' ?, i nic więcej. To nie wydaje się właściwe – Lamak

+0

Easy Lamak nie uczyniono z odpowiedzią ... :-) i nadal nie zostało zrobione .... Zrobione. – Johan

+0

Więc, teraz jesteś gotowy ?. Myślę, że wciąż brakuje warunku, powinieneś również sprawdzić, czy nadawca jest blokowany. – Lamak

9

Spróbuj:

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

Prawdopodobnie powinien dodać "AND Receiver =" Bob'', ponieważ on określa, że ​​chce szukaj wiadomości od Boba. – JNK

+0

@JNK Tak, myślałem o tym wymaganiu, ale nie chciałem dodać tego warunku, ponieważ tabela 'block' jest (podobno) ma wszystkie blokery, nie tylko' Bob'a – Lamak

+0

Dzięki Lamak :) Próbuję teraz inne zapytanie, które powoduje również inny problem z bardzo podobnym scenariuszem, więc opublikujemy go w nowym pytaniu –

Powiązane problemy