使用mysql从orders表中的每个用户的最后5个订单

时间:2013-07-21 20:40:57

标签: php mysql sql

我试图使用mysql从我的订单表中提取每个用户的最后5个订单,但是有些人怎么做不到。

订单按日期排列。

我需要使用mysql

为每个用户提取最后5个订单

表格结构:

订单,BuyerId,日期

订单存储方式如下:

1,1,2013-07-01
2,1,2013-07-02
3,2,2013-07-03
4,2,2013-07-04
5,3,2013-07-06
6,2,2013-07-07
7,2,2013-07-08
8,1,2013-07-09

etc

OrderId是主要索引,唯一

请帮助我,我已经尝试了几个小时,但有些人怎么办不了。

2 个答案:

答案 0 :(得分:2)

这应该适合您 - 您需要为每个组建立一个行号:

select *
from (
  select BuyerId, Date, 
    @rn:=if(@prevBuyerId=BuyerId,@rn+1,1) rn, 
    @prevBuyerId:=BuyerId
  from orders 
    join (select @rn:=0, @prevBuyerId:=0 ) t
  order by BuyerId, Date desc
  ) t
where rn <= 5

以下是一个示例:http://sqlfiddle.com/#!2/bba76/5

在旁注中,我对使用限制和分组的评论感到惊讶...

答案 1 :(得分:1)

您还可以通过执行以下操作在一行中提取最后五个订单:

select buyerid, substring_index(group_concat(order order by date desc), ',', 5) as orders5
from orders o
group by buyerid;

这将以逗号分隔的列表返回它们。如果您想真正获得订单,那么您可以加入他们:

select o.*
from orders o join
     (select buyerid, substring_index(group_concat(order order by date desc), ',', 5) as orders5
      from orders o
      group by buyerid
     ) b
     on o.buyerid = b.buyerid and
        find_in_set(o.orderid, b.orders5) > 0;

但是,我希望带有变量的版本能够更好地运行。