web-dev-qa-db-ja.com

MYSQL-LEFT JOINの行が存在しない場合のみ選択

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)
18
Michael Samuel

左結合は、不一致に対して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';
19
Johan

これを試して:

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