排除存在于另一个表中的记录
Posted
技术标签:
【中文标题】排除存在于另一个表中的记录【英文标题】:exclude records that exist in another table 【发布时间】:2017-09-03 07:54:26 【问题描述】:我有两张这样的桌子:
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
我该怎么做?
【问题讨论】:
重复***.com/questions/4560471/… How to exclude rows that don't join with another table?的可能重复 【参考方案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 JOINS
或 NOT IN
以排除特定表中不存在的记录。
编辑: 通常EXISTS()
和LEFTJOIN
具有相似的性能,有时甚至可以比连接性能更好。
LEFT JOIN
solotion:
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
【讨论】:
您好,在您发布的不存在链接中,它表示将为与主查询匹配的每条记录运行子查询。如果表变大,那么这会成为一个主要问题,特别是如果辅助表也很大?如果是这样,您能否也请发布一个您提到的左连接示例?谢谢 查看编辑。只要您的表被正确索引,两者之间应该没有问题或主要区别,但我还提供了左连接解决方案。 非常感谢 :) 就像你提到的性能是否相似,所以我将使用不存在的方法。这似乎更容易理解。再次感谢:)以上是关于排除存在于另一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章
只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]