我有一个产品库存日志表(见下文)。每次更改产品的库存数量时,会将具有当前库存量的行添加到表中。
因此...
日志表:
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
答案 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字节。这是一个可以轻松更改的会话设置。此外,这会将其他列(quantity
和row_id
)转换为字符串。
最后,我认为原始版本使用正确的索引log(product_id, time)
会更快。但是有可能满足你的条件。