2012-11-09 82 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