Mysql查询不存在的地方

时间:2014-04-21 10:48:21

标签: mysql inner-join

我有三个不同的表 - 订阅者,取消订阅者,大量订阅者。

我想从大众订阅者表中打印出每封电子邮件。但是,只有在订阅者和取消订阅者表中都不存在该电子邮件时才能打印。

我知道如何使用数组执行此操作,但我想要一个简单的mysql查询。

mysql查询是什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

你可以使用子查询来做到这一点(这很慢!请在下面的行中阅读):

SELECT email 
FROM subscribers 
WHERE email NOT IN(SELECT email FROM unsubscribers)

但是,这对性能非常不利。我建议您只使用一个表subscribers来更改数据库的方式,并添加一列active(tinyint)。当有人取消订阅时,您将该值从1设置为0.之后,您可以保留在1个表中:

SELECT email FROM subscribers WHERE active=1

由于某些原因,这更快:

  • 没有子查询
  • 哪里不好,因为你要选择一堆数据,并比较字符串
  • 以非常快的速度选择整数(特别是当您将其编入索引时)

除了这个更快的事实,它对您的数据库结构更好。你不希望两张表几乎一样,使用电子邮件。这将创建重复数据和错位机会

答案 1 :(得分:0)

你听起来像是一个没有太多SQL经验的人。你的头衔指向正确的方向。以下是将组件放在一起的方法:

select m.*
from mass_subscribers m
where not exists (select 1 from subscribers s where s.email = m.email) and
      not exists (select 1 from unsubscribers u where u.email = m.email);
对于此类查询,

NOT EXISTS恰好是一个非常好的选择;它在MySQL和其他数据库中通常非常有效。

答案 2 :(得分:0)

没有子查询,使用连接

SELECT mass_subscribers.*
FROM mass_subscribers ms
LEFT JOIN subscribers s ON ms.email=s.email
LEFT JOIN unsubscribers us ON us.email=s.email
WHERE
ms.email IS NULL
AND
us.email IS NULL