2017-09-03 54 views
0

我有2臺這樣的記錄:排除存在於另一個表

emails: 
emailID int(10) auto_increment, memberID int(10), emailData text, and so on 

members: 
memberID int(10) auto_increment, user_name char(40), password char(50), and so on 

我的查詢是這樣的:

select 
emails.emailID, emails.emailData, 
members.memberID, members.user_name 
from emails, members where 
emails.memberID = members.memberID 

現在我已經添加了兩個更多的表像這樣:

blocked: 
id int(10) auto_increment, memberID int(10), blocked_memberID int(10) 

markedAsRead: 
id int(10) auto_increment, memberID int(10), emailID int(10) 

我想修改我的原始查詢,以便它排除memberID這是blocked.blocked_memberID也是排除emailID哪些在markedAsRead.emailID

我該怎麼做?

+0

重複https://stackoverflow.com/questions/4560471/how-to-exclude-rows-that-dont-join-with-another-table – Dmitry

+1

可能的複製[如何排除不與另一個表連接的行?](https://stackoverflow.com/questions/4560471/how-to-exclude-rows-that-dont-join-with-another-table) – Dmitry

回答

1

您可以使用NOT EXISTS

SELECT .... 
FROM .... 
WHERE ..... // Replace the dots with Your Query 
    AND NOT EXISTS(SELECT 1 FROM blocked 
       WHERE emails.memberID = blocked.memberID) 
    AND NOT EXISTS(SELECT 1 FROM markedAsRead 
       WHERE emails.emailID = markedAsRead.emailID) 

你也可以查找的LEFT JOINSNOT IN排除不存在於一個特定的表中的記錄。

編輯:通常EXISTS()LEFTJOIN有類似performaces,有時它甚至可以執行比加入更好。

LEFT JOIN sulotion:中

SELECT ... 
FROM ... 
LEFT JOIN blocked 
ON(WHERE emails.memberID = blocked.memberID) 
LEFT JOIN markedAsRead 
ON(emails.emailID = markedAsRead.emailID) 
WHERE ... 
AND blocked.memberID IS NULL 
AND markedAsRead.emailID IS NULL 
+0

嗨,在您發佈的不存在的鏈接中,它表示將爲每個匹配主查詢的記錄運行子查詢。如果表格變大,那麼這會成爲一個主要問題,特別是如果次表格也很大?如果是這樣,你是否也可以發表你提到的左連接的例子?謝謝 –

+0

請參閱編輯。只要您的表格索引正確,兩者之間不應該存在問題或主要區別,但我還包含左連接解決方​​案。 – sagi

+0

謝謝sooo多:)像你提到的,如果性能是類似的,所以我會去用不存在的方法。這似乎更容易理解。再次感謝 :) –

相關問題