18

2つの単純なmysqlテーブルがあります。最初の1つはメールと呼ばれ、2つの行があります。

sender | receiver
Marley | Bob 
Saget  | Bob 

2番目はブロックと呼ばれ、1つの行があります。

blocker | blocked
  Bob   | Marley

ボブの電子メールを送信したが、ブロックテーブルでブロックされていない最初のテーブルから送信者を選択したい。したがって、結果は次のようになります。

sender 
 saget

次のクエリを試しましたが、結果が返されません。

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

2 に答える 2

22

左結合は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';
于 2013-03-20T19:15:35.400 に答える
11

これを試して:

SELECT sender
FROM mail m
WHERE NOT EXISTS (SELECT 1 FROM block 
                  WHERE blocker = m.receiver 
                  AND blocked = m.sender)
于 2013-03-20T19:19:02.190 に答える