2012-11-09 3 views
2

SQL 쿼리에서 선택 항목의 역함을 얻으려고합니다. 제 시나리오는 쿼리가있는 가족에 관련된 지불금을 선택하고 지난 6 개월 동안 기부를 한 사람들은 활성화 된 것으로 간주됩니다. 나는 지난 6 개월 동안 입장이없는 사람들에게 관심이 있습니다.MYSQL NOT IN subselect 쿼리

내가 함께 지난 6 개월에 기부를 만든 사람을 선택할 수 있습니다 : 내가 만든하지 않은 사람을 선택하려고 할 때

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

내가 ("내부 서버 오류") 오류가 발생을 기부. (단지 참조) 다음과 같이

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 

전체 코드는 다음과 같이 나는 함수에서 NOT 내부 부속 문 내부에 위의 코드를 사용합니다.

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

나는 다음과 같이 쿼리 바꿔 것 : 용액에 NOT와

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

문제는 내부 쿼리가 하나 개 이상의 null 값이있는 경우, 결과 세트가 비어 있다는 것입니다. 내부 쿼리의 where 절에서 IS NOT NULL을 추가하여이 문제를 해결할 수 있습니다.

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