MYSQL NOT IN 子选择查询
Posted
技术标签:
【中文标题】MYSQL NOT IN 子选择查询【英文标题】:MYSQL NOT IN subselect Query 【发布时间】:2012-11-09 06:12:17 【问题描述】:我正在尝试从 sql 查询中获取选择的逆。这是我的场景,我选择与查询的家庭相关的付款,并且在过去 6 个月内进行过捐赠的人被认为是活跃的。我对过去 6 个月内没有参赛作品的人感兴趣。
我可以选择在过去 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
感谢您对此问题的任何见解。
【问题讨论】:
【参考方案1】:NOT IN 解决方案的问题在于,如果内部查询有一个或多个空值,则结果集为空。 您可以尝试在内部查询的 where 子句中添加 IS NOT NULL 来解决这个问题。
WHERE ((DATEDIFF( NOW(), ppl.plg_date ) < 180) ) AND ppl.plg_date IS NOT NULL
【讨论】:
【参考方案2】:我将查询改写如下:
SELECT ppl.plg_FamID
FROM pledge_plg AS ppl
HAVING MAX(pp.plg_date) < DATE_SUB( CURDATE(),INTERVAL 180 DAY);
【讨论】:
以上是关于MYSQL NOT IN 子选择查询的主要内容,如果未能解决你的问题,请参考以下文章