如何从产品清单中获取最后修改的行

时间:2016-09-16 18:20:48

标签: mysql sql

我有一个产品库存日志表(见下文)。每次更改产品的库存数量时,会将具有当前库存量的行添加到表中。

因此...

  • 如何知道指定时间内库存中的产品数量和产品数量?
  • 是否可以通过一个查询了解这一点?
  • 没有连接或子查询怎么样?

日志表:

row_id  quantity    time                product_id
2413407 1           2016-09-16 13:16:48 122559
2413408 3696        2016-09-16 20:46:42 121152
2413409 3697        2016-09-16 20:46:45 121152
2413410 786         2016-09-16 20:46:47 121152
2413411 3           2016-09-16 20:53:19 128034
2413412 1           2016-09-16 20:53:20 143362
2413413 2           2016-09-16 20:53:30 128051

例如使用时间戳2016-09-16 20:46:46我想把这些行拿走(因为这是当时的确切库存):

row_id  quantity    time                product_id
2413407 1           2016-09-16 13:16:48 122559
2413409 3697        2016-09-16 20:46:45 121152

1 个答案:

答案 0 :(得分:2)

您将需要子查询或联接。这是一种方式:

select l.*
from log l
where l.time = (select max(l2.time)
                from log l2
                where l2.product_id = l.product_id and
                      l2.time <= '2016-09-16 20:46:46'
               );

我不应该这么说。没有join或子查询,至少有一种方法可以实现此目的:

select product_id,
       substring_index(group_concat(row_id order by time desc), ',', 1) as row_id,
       substring_index(group_concat(quantity order by time desc), ',', 1) as quantity,
       max(time)
from log l
where l.time <= '2016-09-16 20:46:46'
group by product_id;

此方法有点危险,因为中间group_concat()字符串限制为1,024字节。这是一个可以轻松更改的会话设置。此外,这会将其他列(quantityrow_id)转换为字符串。

最后,我认为原始版本使用正确的索引log(product_id, time)会更快。但是有可能满足你的条件。