好的,我会尽力解释这个问题:
情景是我们正在尝试跟踪数量不断变化的物品的当前库存情况。
它的设置方式是,每当一个项目的数量发生变化时,一行就会被写入一个记录项目SKU,最新数量和时间戳的MySQL表“跟踪”。
例如:
Dec. 4, 2010 --- Item #12 --- 200
Dec. 5, 2010 --- Item #33 --- 150
Dec. 8, 2010 --- Item #12 --- 50
问题是我们想回答这个问题 - 我们在任何时间点有多少项目?
由于数据稀疏问题,这比它看起来更难。
让我们说在2010年12月4日,我们有200个项目#12 然后在2010年12月8日,我们有50个相同的项目(项目#12) 同时,在2010年12月5日,我们有150个项目#33
12月4日,5日和8日,我们有多少项目? 正确答案是12月4日总计200,12月5日350,以及12月8日200。我们如何获得这些数字?好吧,我们必须从一个日期到下一个日期继续进行项目的数量。即使我们没有在第二天指定我们对该项目的数量,我们也必须假设我们的数量与前一天一样多。
所以,12月4日,我们有200个项目#12,依此类推12月5日,我们仍然有200个项目#12,在此基础上我们现在有150个项目#33。这将在12月5日产生350.然后在12月8日,我们仍然有150个项目#33,但只有50个项目#12,只产生200个项目。
查询应返回以上数据的结果:
Dec. 4, 2010: 200 items
Dec. 5, 2010: 350 items
Dec. 8, 2010: 200 items
棘手的问题是可能存在数千项......这使MYSQL和PHP操作变得非常复杂。
我正在寻找一种最佳解决方案,它可以充分利用MYSQL和PHP来解决这个问题。临时表可能会像在一个大的PHP关联数组中干扰数据一样工作,但我觉得有更好的方法可以做到这一点。
答案 0 :(得分:0)
我认为更好的方法是使用更改的项目数更新跟踪表。例如,在你的例子中,而不是第二个条目,说项目#12有50,你会说它有-150,因为这是从前一个操作的变化。
您可以让更新此表的脚本将其考虑在内。使用SUM
获取项目总数,然后随更改一起更新。
SELECT SUM(quantity) FROM tracking WHERE item=12;
(获取该查询的值)
$change_value = $new_quantity - $quantity_from_db;
然后使用$ change_value;
更新跟踪表要获取报告,查询与@ benisu相同。您可以使用范围而不是选择特定日期按日期来完成。例如,在12月5日获取快照:
SELECT item, SUM(quantity) FROM tracking WHERE date <= '2010-12-05' GROUP BY item
希望有所帮助。
编辑:我看到你希望他们按日期和总项目返回。不幸的是,我不相信你可以在一个查询中做到这一点,因为你必须告诉MySQL在一个范围内一起添加值。按日期分组将仅为您提供快照。您最好的选择是遍历一系列日期,然后为每个日期发出查询:$array_of_dates = array('2010-12-05', '2010-12-08', '2010-12-11');
foreach( $array_of_dates as $date ) {
$query = "SELECT SUM(quantity) FROM tracking WHERE date <= '$date'"; // don't use this unless your date input is static or sanitized!
// your database layer of choice here to execute the query
echo "$date: $quantity_from_query";
}
答案 1 :(得分:0)
我不确定我完全理解你的问题,从我收集到目前为止你想要每个日期的所有项目总数?如果是这样,那么可以使用group by和sum()在MySQL中轻松处理。我不确定你的架构是什么样的,所以这是我的摇摆:
SELECT sum(item_quantity)as item_quantity_sum,date FROM items GROUP BY date
答案 2 :(得分:0)
假设您的表名为log
并且有三个字段,item
,ts
(时间戳)和quantity
,以及{{1} }包含增量而不是总计(按照Cfreak的建议):
quantity