排除存在于另一个表中的记录

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 JOINSNOT IN 以排除特定表中不存在的记录。

编辑: 通常EXISTS()LEFTJOIN 具有相似的性能,有时甚至可以比连接性能更好。

LEFT JOINsolotion:

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

【讨论】:

您好,在您发布的不存在链接中,它表示将为与主查询匹配的每条记录运行子查询。如果表变大,那么这会成为一个主要问题,特别是如果辅助表也很大?如果是这样,您能否也请发布一个您提到的左连接示例?谢谢 查看编辑。只要您的表被正确索引,两者之间应该没有问题或主要区别,但我还提供了左连接解决方​​案。 非常感谢 :) 就像你提到的性能是否相似,所以我将使用不存在的方法。这似乎更容易理解。再次感谢:)

以上是关于排除存在于另一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 根据记录是不是存在于另一个表中选择布尔值

如果记录存在于另一个表中,则条件格式详细信息行

只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]

如何获取一个MySql表中存在的记录而不是另一个[重复]

SQL Server 查询。用户存在于另一个表中但不存在用户的位置

列出存在于另一个模型中的所有关联模型记录,该模型存在于 rails 中的另一个命名空间中