簡體   English   中英

MySQL不在子查詢不按預期工作

[英]MySQL NOT IN with subquery not working as expected

我正在創建一個應用程序,它將為電子郵件營銷活動生成列表。 我有聯系人,電子郵件和廣告系列的表格。 廣告系列包含許多電子郵件,而聯系人則包含許多電子郵件。 該電子郵件與聯系人和廣告系列相關。 基本上是一個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)

將。

請查看MYSQL中NOT INNULL的行為。

為了您的關注,您應該使用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?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM