我正在尝试显示可供献血的捐赠者名单。为此,我正在计算他们的最后捐赠日期是否在90天之前。这是我的疑问:
select *
from donar, donation
donar.id=donation.donar_id
and sex='female'
and datediff(curdate(),donation_date) > 120
问题是它完全显示了捐赠者的名字,但如果捐赠者现在给了血,它仍然在列表中显示他的名字,因为他在90天之前有一个先前的条目。我该如何解决这个问题?
答案 0 :(得分:3)
您错过了示例中的位置。给出一个镜头......你需要从另一个角度看问题...根据你的评论,这里有一个简单的方法来获得不同日期限制的男性和女性。你可以在没有UNION的情况下做到这一点,但我认为工会保留了男女不同日子的逻辑。
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'
基本上这个查询说“给我所有人在donar表中,包括90天捐赠的人的信息,然后只显示那些没有捐赠细节的人(AKA人员在90天内没有捐赠)。
答案 1 :(得分: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;