1

献血できるドナーのリストを表示しようとしています。このために、前回の寄付日が 90 日より前かどうかを計算しています。これが私のクエリです:

select *
from donar, donation
    donar.id=donation.donar_id
    and sex='female'
    and datediff(curdate(),donation_date) > 120

問題は、献血者の名前が完全に表示されることですが、献血者が献血した場合でも、90 日前のエントリがあるため、献血者の名前がリストに表示されます。どうすればこれを解決できますか?

4

2 に答える 2

3

あなたの例では where がありません。これを試してみてください...クエリを別の角度から見る必要があります...以下のコメントに基づいて、異なる日の制限で男性と女性を取得する簡単な方法を次に示します。UNION がなくても 1 つのステートメントでこれを行うことができるかもしれませんが、ユニオンは男性と女性の異なる日の論理を維持していると思います。

 SELECT * from donor 
   LEFT JOIN donation ON donor.id=donation.donor_id 
        AND donation.donation_date > NOW() - INTERVAL 120 day
 WHERE donation.donation_id IS NULL  
      AND donor.sex='female' 

 UNION   

 SELECT * from donor 
   LEFT JOIN donation ON donor.id=donation.donor_id 
        AND donation.donation_date > NOW() - INTERVAL 90 day
 WHERE donation.donation_id IS NULL  
      AND donor.sex='male' 

基本的に、このクエリは「寄付テーブルにあるすべての人を教えてください。90 日以内に寄付をした人に関する情報を含め、寄付の詳細がない人 (90 日間寄付していない人) のみを表示します。

于 2012-10-28T21:56:08.043 に答える
0
select * from donar 
       left join donation 
                 on ( donar.id=donation.donar_id )
       where (
               ( sex='female' and datediff(curdate(),donation_date) > 120) 
               or 
               ( sex='male' and datediff(curdate(),donation_date) > 90) 
             )
             or donation.id is null;
于 2012-10-28T23:30:46.237 に答える