MySQL不在子查询不按预期工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL不在子查询不按预期工作相关的知识,希望对你有一定的参考价值。
我正在创建一个应用程序,它将为电子邮件营销活动生成列表。我有联系人,电子邮件和广告系列的表格。广告系列包含许多电子邮件,而联系人则包含许多电子邮件。该电子邮件与联系人和广告系列相关。基本上是一个MANY到MANY关系的表,除了我在表格中有其他字段用于电子邮件的结果(点击,打开,取消订阅等)。还有其他表,但这是我遇到麻烦的地方。
我正在尝试使用带有子查询的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条记录取消订阅= 1而不是第二次查询。所以,我的第一个查询应该返回8249结果,但它返回0.我必须构造错误的查询或使用错误的运算符,但我不能为我的生活弄清楚如何做到这一点。
有人可以帮忙吗?非常感谢,因为这让我难以忍受了3天! :)
这是因为
SELECT 1 FROM DUAL WHERE 1 NOT IN (NULL, 2)
不会返回任何东西,而
SELECT 1 FROM DUAL WHERE 1 NOT IN (2)
将。
请查看NOT IN
和NULL
在mysql中的行为。
为了您的关注,您应该使用NOT EXISTS
而不是NOT IN
来逃避它:
SELECT * FROM `contact` `t`
WHERE (unsubscribed='1')
AND NOT EXISTS (
SELECT * FROM email, campaign
WHERE
email.campaign_id = campaign.id
AND campaign.date_sent >= '2012-07-12'
AND t.id = contact_id
)
ORDER BY rand()
LIMIT 10000
这也浪费了几个小时和几根头发。
无法让“不存在”作为所提到的接受答案而工作。但是,你可以简单地输入一个NOT NULL
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
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
我认为campaign.date_sent是一个错字?它必须是email.date_sent?
以上是关于MySQL不在子查询不按预期工作的主要内容,如果未能解决你的问题,请参考以下文章