2013-03-20 28 views
15

Tôi có 2 bảng mysql đơn giản. 1 đầu tiên được gọi là mail và có 2 hàng:MYSQL - Chỉ chọn nếu hàng trong LEFT JOIN không có mặt

sender | receiver 
Marley | Bob 
Saget | Bob 

thứ hai được gọi là khối và có 1 hàng:

blocker | blocked 
    Bob | Marley 

Tôi muốn chọn người gửi (s) từ bảng đầu tiên người gửi Bob email nhưng không bị chặn trong bảng khối. Vì vậy, các kết quả sẽ là:

sender 
saget 

Tôi đã thử các truy vấn sau đây nhưng nó không trả kết quả:

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

Nhưng ' Saget' bị chặn bởi 'Bob' – Lamak

+0

Trên thực tế kết quả không nên là' saget', bởi vì bạn thấy, Bob đã chặn cả hai. –

+0

xin lỗi tôi đã thực hiện một sai lầm ngu ngốc ... marley chỉ bị chặn trong khi saget không –

Trả lời

18

Các trái tham gia sẽ tạo ra null hàng cho sai lệch.
Đó là những dòng null hàng bạn cần lọc.

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

Nó loại siết cổ để được gia nhập vào một giá trị cố định tuy nhiên, một phổ biến hơn join (cho bảng của bạn) sẽ là:

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

Bạn đang tham gia với giá trị hardcoded cho ''Bob'' ?, và không có gì khác ?. Điều đó không có vẻ đúng – Lamak

+0

Dễ dàng Lamak đã không được thực hiện với câu trả lời ... :-) và vẫn chưa xong .... Xong. – Johan

+0

Vì vậy, bây giờ bạn đã xong ?. Tôi nghĩ rằng điều này vẫn còn thiếu một điều kiện, bạn cũng nên kiểm tra xem người gửi đang bị chặn – Lamak

9

Hãy thử điều này:

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

Có lẽ nên thêm 'AND Receiver = 'Bob'' vì anh ta chỉ định anh ta muốn tìm thư từ Bob. – JNK

+0

@JNK Vâng, tôi đã nghĩ về yêu cầu đó, nhưng do dự khi thêm điều kiện đó, vì bảng 'block' là (dường như) có tất cả các trình chặn, không chỉ' Bob' – Lamak

+0

Cảm ơn Lamak :) Tôi đang cố gắng một truy vấn khác cũng gây ra một vấn đề khác với một kịch bản rất giống nhau, do đó sẽ đăng nó trong một câu hỏi mới –