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)
左結合は、不一致に対して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';
これを試して:
SELECT sender
FROM mail m
WHERE NOT EXISTS (SELECT 1 FROM block
WHERE blocker = m.receiver
AND blocked = m.sender)