MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?

Posted

技术标签:

【中文标题】MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?【英文标题】:MySQL: select emails from one table only if not in another table? 【发布时间】:2009-06-16 16:57:25 【问题描述】:

我将构建一个名为 donotemail 的表,其中将包含要求从我们的电子邮件列表中删除的人员的电子邮件地址。我有另一个名为 users 的表,其中包含一个电子邮件列。我如何才能选择所有来自用户的电子邮件,但前提是电子邮件地址不在 donotemail 表中?

谢谢!

【问题讨论】:

【参考方案1】:

试试

SELECT Email.address
FROM Email LEFT OUTER JOIN DoNotMail on Email.address = DoNotMail.address
WHERE DoNotMail.address is null

它避免了需要子查询。

【讨论】:

哈,当我看到一个新的答案已经发布时,我正在写一个类似的查询。好东西我在提交前检查了。 确实似乎有很多答案 - 我之前的四个都是在我写答案时发布的:)【参考方案2】:
 select u.email from users u where u.email not in (select email from donotemail)

select u.email from users u inner join donotemail d on u.email != d.email

编辑:连接不起作用

【讨论】:

"inner join donotemail d on u.email != d.email" ??你会加入其他所有用户,不是吗? 是的,但这将是一个空集,因为 donoteamail 应该将电子邮件作为其主键 什么? u = [a@example.com, b@exemple.com, c@exemple.com], donotemail = [a, b] => 不同的内连接 = [a/b, b/a, c/a, c /b] 没有? 拜伦:呃……你确定吗?如果 email 是两个表中的主键,则 u.email != d.email 对于第二个表中的 n 或 n-1 行将为 true,其中 n 是第二个表中的行数。 @Streetpc 是的,我认为你是对的,我一直在努力解决问题所在。我认为你会得到 u x d-1 结果,这不是你想要的【参考方案3】:

试试这个:

SELECT email
FROM users u
WHERE NOT EXISTS(
    SELECT 1 FROM no_mail_users nmu
    WHERE nmu.id = u.id
)

【讨论】:

相关子查询极其缓慢,因为您最终在外部表中的每一行都有一个查询。【参考方案4】:

为什么不在您的电子邮件表中添加另一列,标记为“活动”,设置为 1 时表示当前正在发送电子邮件,设置为 0 时不再发送电子邮件,那么您可以根据该开关进行选择和过滤?

干杯

【讨论】:

【参考方案5】:
select email from users where email not in (select email from donotemail)

【讨论】:

连接比子选择快得多 如果你在donotemail中有一个NULL email,它会返回一个空集 @artemb 取决于,如果查询优化器知道不应该重新获取它,则子选择只能执行一次 @streetpc:根据mysql手册,IN子查询转换为相关子查询:dev.mysql.com/doc/refman/5.0/en/subquery-restrictions.html

以上是关于MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

怎么从一张表中查询数据插入到另一张表中

根据查找值将值从一张表匹配并粘贴到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中

oracle 从一张表的数据复制到另一张表中 mapper.xml