2012-11-09 125 views
2

我試圖從SQL查詢中獲取選擇的反轉。這裏是我的情景,我選擇與查詢有關的家庭付款,並且在過去6個月內已經捐款的人被認爲是活躍的。我對過去6個月沒有進入的人感興趣。MYSQL NOT IN子查詢

我可以選擇那些誰作出了捐贈在過去的6個月:

SELECT ppl.plg_FamID 
FROM pledge_plg AS ppl 
WHERE ((DATEDIFF(NOW(), ppl.plg_date) < 180)) 

我得到一個錯誤(「內部服務器錯誤」),當我嘗試選擇誰沒有做的那些捐款。我用上面的代碼子查詢語句中的NOT IN內部功能如下:

SELECT pp.plg_FamID 
FROM pledge_plg AS pp 
WHERE pp.plg_FamID NOT IN (
     SELECT ppl.plg_FamID 
     FROM pledge_plg AS ppl 
     WHERE ((DATEDIFF(NOW(), ppl.plg_date) < 180)) 
    ) 
ORDER BY pp.plg_FamID ASC, pp.plg_date DESC 
LIMIT 0, 30 

完整的代碼(僅供參考),如下所示。

SELECT DISTINCT 
    ff.fam_Envelope AS ENV, 
    ff.fam_ID AS "Family ID", 
    ff.fam_Name AS Family, 
    fc.c3 AS "Active?", 
    pp.plg_date, 
    (DATEDIFF(NOW(), pp.plg_date)) 
FROM 
    family_fam AS ff 
LEFT JOIN family_custom AS fc ON ff.fam_ID = fc.fam_ID 
LEFT JOIN pledge_plg AS pp ON ff.fam_ID = pp.plg_FamID 
WHERE 
    fc.c3 = "true" 
    AND pp.plg_FamID NOT IN (
     SELECT ppl.plg_FamID 
     FROM pledge_plg AS ppl 
     WHERE ((DATEDIFF(NOW(), ppl.plg_date) < 180)) 
    ) 
ORDER BY ff.fam_ID ASC, pp.plg_date DESC 
LIMIT 0, 30 

在這個問題上的任何洞察力表示讚賞。

回答

0

我會改寫爲下面的查詢:

 SELECT ppl.plg_FamID 
    FROM pledge_plg AS ppl 
    HAVING MAX(pp.plg_date) < DATE_SUB(CURDATE(),INTERVAL 180 DAY); 
1

而不是出現問題,解決方法是,如果內部查詢有一個或多個空值,結果集是空的。 您可以嘗試解決這個問題,在內部查詢的where子句中添加IS NOT NULL。

WHERE ((DATEDIFF(NOW(), ppl.plg_date) < 180)) AND ppl.plg_date IS NOT NULL