0

我正在尝试使用 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 是主索引,唯一

请帮帮我,我已经为此尝试了几个小时,但有些做不到。

4

2 回答 2

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

在旁注中,我对使用 limit 和 group by 的评论感到惊讶...

于 2013-07-21T21:11:20.330 回答
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;

但是,我希望带有变量的版本表现更好。

于 2013-07-21T21:54:32.680 回答