棘手的MySQL / PHP数据问题:使用结转来计算稀疏数据的总数

时间:2011-03-01 04:10:33

标签: php mysql

好的,我会尽力解释这个问题:

情景是我们正在尝试跟踪数量不断变化的物品的当前库存情况。

它的设置方式是,每当一个项目的数量发生变化时,一行就会被写入一个记录项目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关联数组中干扰数据一样工作,但我觉得有更好的方法可以做到这一点。

3 个答案:

答案 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并且有三个字段,itemts(时间戳)和quantity以及{{1} }包含增量而不是总计(按照Cfreak的建议):

quantity