如果过期优惠券的日期恰好是1个月之前,或者最后一个帐单日期(b.date
)恰好是一个月前,我已经通过cronjob自动创建帐单了。条件只能发生一次,因为具体日期将来不会是1个月前。
SELECT *
FROM `coupons` AS c
LEFT JOIN `partners` AS p ON p.`id` = c.`pid`
LEFT JOIN `bills` AS b ON b.`pid` = c.`pid`
WHERE
(
CURRENT_DATE() = DATE_ADD(c.`expires`, INTERVAL 1 MONTH) // add something here?
OR
CURRENT_DATE() = DATE_ADD(b.`date`, INTERVAL 1 MONTH)
)
我的问题是,在第一个WHERE条件中,我得到了超过1个结果。所以我正在寻找一种解决方案,只选择b.date
的最新且只有一行。
我将不胜感激。
答案 0 :(得分:1)
是的,只需在最后添加'LIMIT 1':请参阅MySQL documentation for select。
但请注意,您必须添加ORDER BY以确保获得“最新”行,具体取决于您的意思 - bills.date
或coupons.expires
?
答案 1 :(得分:1)
如果您想使用最新结果,请使用bills.date行上的Max函数(请参阅:http://www.w3schools.com/sql/sql_func_max.asp)。
答案 2 :(得分:1)
此处的问题是bills
与partners
相关,而与coupons
无关。例如,您的SQL就像这样:
drop table if exists coupons;
create table coupons (id int not null, pid int not null, expires date, primary key(id));
drop table if exists bills;
create table bills (id int not null, pid int not null, `date` date, primary key(id));
drop table if exists partners;
create table partners ( id int, name varchar(20), primary key(id));
我们填充了一些数据:
insert into partners values (1,'One');
insert into coupons values (1,1,'2011-12-12'), (2,1,'2011-11-11');
insert into bills values (1,1,'2011-12-12'), (2,1,'2011-11-11');
此时
select * from coupons c
left join partners p on c.pid = p.id
left join bills b on b.pid = c.pid
返回4行,这是有意义的:(partner1,coupon1,bill1),(p1,c1,b2),(p1,c2,b1),(p1,c2,b2)。如果我们添加:
where
(
current_date() = date_add(c.expires, interval 1 month)
or
current_date() = date_add(b.`date`, interval 1 month)
)
我们得到3行:(p1,c1,b1),(p1,c1,b2),(p1,c2,b1)。为什么?因为coupon2或bill2都没有在测试中成功,而其他每个组合中至少有一个成功。
我怀疑你真正想要的是更接近:
select *
from coupons c
where
c.id in
(select distinct c2.id from coupons c2
left join partners p2 on c2.pid=p2.id
left join bills b2 on b2.pid=c2.pid
where
current_date()=date_add(c2.expires, interval 1 month)
or
current_date()=date_add(b2.`date`, interval 1 month)
)
在这里,我使用子查询获取符合您要求的优惠券的不同优惠券ID列表,然后只检索这些优惠券。
但是,玩它,我不确定你的要求是否完全有道理:你正在检索一个月前有一个到期日的优惠券,或者与一个月前收到的合作伙伴有关的优惠券?在这种方法中,您只获得优惠券列表,然后需要检索最新的帐单或合作伙伴详细信息,假设始终存在关联的合作伙伴?有吗?
希望有所帮助,克雷格
答案 3 :(得分:0)
不确定它是否适用于MySQL但是LIMIT 1