MySQL不在,子查询未按预期工作

MySQL不在,子查询未按预期工作,mysql,subquery,notin,Mysql,Subquery,Notin,我正在创建一个应用程序,它将生成电子邮件营销活动的列表。我有联系人、电子邮件和活动的表格。一个活动有许多电子邮件,一个联系人有许多电子邮件。该电子邮件与联系人和活动相关。基本上是一个多对多关系的表,除了表中有其他字段用于显示电子邮件点击、打开、取消订阅等结果。还有其他表,但这就是我遇到的问题 我正在尝试使用NOT IN和子查询来获取自某个日期以来未收到电子邮件的联系人列表,这些联系人具有其他条件。查询示例如下: SELECT * FROM `contact` `t` WHERE (unsub

我正在创建一个应用程序,它将生成电子邮件营销活动的列表。我有联系人、电子邮件和活动的表格。一个活动有许多电子邮件,一个联系人有许多电子邮件。该电子邮件与联系人和活动相关。基本上是一个多对多关系的表,除了表中有其他字段用于显示电子邮件点击、打开、取消订阅等结果。还有其他表,但这就是我遇到的问题

我正在尝试使用NOT IN和子查询来获取自某个日期以来未收到电子邮件的联系人列表,这些联系人具有其他条件。查询示例如下:

SELECT * 
FROM `contact` `t` 
WHERE (unsubscribed='1')
  AND t.id NOT IN 
   (SELECT distinct contact_id 
    FROM email, campaign 
    WHERE email.campaign_id = campaign.id 
      AND campaign.date_sent >= '2012-07-12') 
ORDER BY rand() 
LIMIT 10000
这将返回0个结果。但是,如果运行第一个条件:

select id 
from contact 
where unsubscribed=1
我有9075行。然后,如果我单独运行子查询:

SELECT distinct contact_id 
FROM email, campaign 
WHERE email.campaign_id = campaign.id 
  AND campaign.date_sent >= '2012-07-12'

我有116612排。在这些结果中,我得到了826个重复的值。据我所知,这意味着9075-826=8249条记录是unsubscribed=1,而不是在第二次查询中。因此,我的第一个查询应该返回8249个结果,但它返回0。我一定是构造了错误的查询,或者使用了错误的运算符,但我一辈子都想不出如何正确处理这个问题

有人能帮忙吗?提前非常感谢,因为这已经让我难堪了三天了!:

select c.*, e.id from contact as c 
left join email as e on c.id = e.contact_id and e.date_sent >= '2012-07-12' 
where e.id is null and c.unsubscribed = 1
我认为你发送的是一个打字错误?必须是电子邮件。发送日期?

这是因为

SELECT 1 FROM DUAL WHERE 1 NOT IN (NULL, 2) 
不会归还任何东西,但是

SELECT 1 FROM DUAL WHERE 1 NOT IN (2)
威尔

请检查MYSQL中NOT IN和NULL的行为

出于您的考虑,您应该使用NOT EXISTS(不存在)而不是NOT IN(不存在):


只是在这上面浪费了几个小时和几根头发

无法按照所述的已接受答案获取“不存在”以工作。但是,您可以简单地在

正在聚合的WHERE字段不为NULL,这就完成了任务

SELECT * 
FROM `contact` `t` 
WHERE (unsubscribed='1')
  AND t.id NOT IN 
   (SELECT distinct contact_id 
    FROM email, campaign 
    WHERE email.campaign_id = campaign.id 
      AND campaign.date_sent >= '2012-07-12'
      AND contact_id is not NULL          ###*************added line
) 
ORDER BY rand() 
LIMIT 10000

您是如何检查的:826个重复的值?请给出SELECT*FROM email、MAGITANCE WHERE email.MAGITANCE\u id=MAGITANCE.id和MAGITANCE.date\u sent>='2012-07-12'和contact\u id为空的结果。据我所知,这意味着9075-826=8249条记录被取消订阅=1,而不是在第二次查询中。嗯,不。这意味着你有116612-826=115786个你不想包含的唯一联系人id。9075个联系人中的部分或全部是否在该组中是另一个问题。@Razvam-我将结果导出到Excel并删除了重复项,这是它给我的数字。@Roland,我不确定是否理解您的意思。第一个条件的结果是9075个未订阅的人。从这一点上,我想得到所有那些自7月12日以来没有收到过电子邮件的人,所以我应该不能得到超过9075个结果。如果我对它的理解不正确,那么我需要重写查询。无论哪种方式,我的查询返回的结果都是0,这与我们的想法相反!谢谢你到目前为止的帮助!你为什么忽略了电子邮件和活动之间的联系?看起来是非常重要的一点。一个活动的所有电子邮件都是在某个日期发送的,而该日期是从活动表中发送的日期。而不是把你发送的日期写在活动中的每封电子邮件上。嘿,塞巴斯,我已经尝试使用“查询中不存在”了,它对我不起作用。这就是我尝试的:从联系人t中选择*其中1=1,取消订阅='1'且不存在从电子邮件中选择不同的联系人id,活动中的email.campaign\u id=campaign.id和campaign.date\u sent>='2012-07-01'订单按兰特限制10000。它给了我与上面使用NOT相同的结果。关于。它确实可以处理这个查询,但只为我返回了36个结果,这是我没有预料到的。我会调查一些预期的结果,并将它们与我得到的结果进行比较,如果它是准确的,我会让你知道。
SELECT * 
FROM `contact` `t` 
WHERE (unsubscribed='1')
  AND t.id NOT IN 
   (SELECT distinct contact_id 
    FROM email, campaign 
    WHERE email.campaign_id = campaign.id 
      AND campaign.date_sent >= '2012-07-12'
      AND contact_id is not NULL          ###*************added line
) 
ORDER BY rand() 
LIMIT 10000