MySQL查询 - 只选择特定行的最新结果?

时间:2012-01-12 12:16:37

标签: mysql date select where

如果过期优惠券的日期恰好是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的最新且只有一行。

我将不胜感激。

4 个答案:

答案 0 :(得分:1)

是的,只需在最后添加'LIMIT 1':请参阅MySQL documentation for select

但请注意,您必须添加ORDER BY以确保获得“最新”行,具体取决于您的意思 - bills.datecoupons.expires

答案 1 :(得分:1)

如果您想使用最新结果,请使用bills.date行上的Max函数(请参阅:http://www.w3schools.com/sql/sql_func_max.asp)。

答案 2 :(得分:1)

此处的问题是billspartners相关,而与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