Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
棘手的MySQL/PHP数据问题:使用结转从稀疏数据计算总计_Php_Mysql - Fatal编程技术网

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

棘手的MySQL/PHP数据问题:使用结转从稀疏数据计算总计,php,mysql,Php,Mysql,好的,我会尽力在这里解释这个问题: 这种情况是,我们试图跟踪数量不断变化的项目的当前库存 它的设置方式是,每当一个项目的数量发生变化时,都会向MySQL表“跟踪”写入一行,该表记录项目SKU、最新数量和时间戳 例如: Dec. 4, 2010 --- Item #12 --- 200 Dec. 5, 2010 --- Item #33 --- 150 Dec. 8, 2010 --- Item #12 --- 50 问题是我们想回答这个问题——在任何时间点,我们总共有多少个项目 由于数据稀疏

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

这种情况是,我们试图跟踪数量不断变化的项目的当前库存

它的设置方式是,每当一个项目的数量发生变化时,都会向MySQL表“跟踪”写入一行,该表记录项目SKU、最新数量和时间戳

例如:

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关联数组中阻塞数据一样工作,但我觉得有更好的方法可以做到这一点。

我认为更好的方法是根据更改的项目数更新跟踪表。例如,在您的示例中,不是第二个条目说条目12有50,而是说它有-150,因为这是对上一个操作的更改

您可以让更新此表的脚本考虑到这一点。使用SUM获取项目总数,然后使用更改进行更新

SELECT SUM(quantity) FROM tracking WHERE item=12;
获取该查询的值

$change_value = $new_quantity - $quantity_from_db;
然后用$change_值更新跟踪表

要获取报告,查询与@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";
} 

我不确定我是否完全理解你的问题,从我目前收集的信息来看,你想要每个日期所有项目的总和吗?如果是这样的话,在MySQL中使用GROUPBY和sum可以很容易地处理这个问题。我不确定您的模式是什么样子的,因此下面是我的wag:


选择sumitem_quantity作为item_quantity_sum,date FROM items GROUP BY date

假设您的表名为log,包含三个字段:item、ts时间戳和quantity,并且该数量包含Delta而不是Cfreak建议的总计:

set @total = 0;
select ts, c, @total := @total + c from 
(select ts, sum(quantity) c from log group by ts order by ts) days;

这不起作用,因为在任何特定日期,您只有特定项目的数据。。。但是你实际拥有的总量是从之前日期的数量结转过来的。例如,如果我周一有4个苹果,我问我总共有多少个水果,我周一会得到4个。如果我在周二加一个橘子,那么现在的答案是在周二加5个水果。但是我不能进入一个新的行来重复星期二我有4个苹果。我只想在星期一指定4个苹果,在星期二指定1个橙色,如果我在星期三有0个苹果,我想在星期一、星期二和星期三的总数分别为4个、5个和1个。不确定这将如何给出上面编辑的查询结果。如果12月8日第12项有-150,12月5日的查询会显示什么?它应该显示350-查询是跨所有项目进行查询的,而不是特定的项目。Tnx用于编辑!但即使在这个版本中,它也会把所有的项目加在一起——例如,在12月8日,它会把以前的所有数量加在一起,即使项目12的数量实际上下降了。12月8日的金额为400,答案应该是200,否?是否会按照上述日期给出金额,并从以前的日期结转项目?当我运行上面的一个版本时,它似乎提供了一个单一的和数,这在我的上下文中是没有意义的,因为根据日期的变化。第二个想法,你真的应该考虑记录Deltas而不是绝对值,就像CFRAK建议的那样。否则,就没有有效的方法来计算总和。
好的,我现在编辑了我的答案,但现在需要你记录delta。