2

SQLクエリから選択の逆を取得しようとしています。これが私のシナリオです。クエリを使用して家族に関連する支払いを選択し、過去6か月間に寄付を行った人はアクティブであると見なされます。過去6ヶ月間エントリーがない方に興味があります。

過去6か月間に寄付を行った人を次の方法で選択できます。

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

寄付していないものを選択しようとすると、エラー(「内部サーバーエラー」)が発生します。次のように、NOTIN関数内のsubselectステートメント内で上記のコードを使用します。

    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

この問題に関する洞察をいただければ幸いです。

4

2 に答える 2

1

NOT INソリューションの問題は、内部クエリに1つ以上のnull値がある場合、結果セットが空になることです。内部クエリのwhere句にISNOTNULLを追加することで、この問題を解決することができます。

WHERE  ((DATEDIFF( NOW(), ppl.plg_date ) < 180) ) AND ppl.plg_date IS NOT NULL
于 2012-11-09T08:51:53.320 に答える
0

クエリを次のように言い換えます。

     SELECT ppl.plg_FamID
     FROM pledge_plg AS ppl
     HAVING MAX(pp.plg_date) < DATE_SUB( CURDATE(),INTERVAL 180 DAY); 
于 2012-11-09T06:20:37.603 に答える