Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
Php 每30天范围内的列计数_Php_Mysql_Sql - Fatal编程技术网

Php 每30天范围内的列计数

Php 每30天范围内的列计数,php,mysql,sql,Php,Mysql,Sql,我有一张桌子,看起来像这样: Person Product Date Quantity 1 A 1/11/2014 1 2 A 1/11/2014 2 1 A 1/20/2014 2 3 A 1/21/2014 1 3 B 1/21/2014

我有一张桌子,看起来像这样:

Person     Product     Date         Quantity
1            A       1/11/2014        1
2            A       1/11/2014        2
1            A       1/20/2014        2
3            A       1/21/2014        1
3            B       1/21/2014        1
1            A       1/25/2014        1
我想在任何滑动30天范围内,找到产品数量和个人数量>1的数量。另一个关键是,一旦两个记录满足条件,它们就不应该再次添加到计数中。例如,对于1/11和1/20,人员1的计数将为3,但是对于1/20和1/25,人员1的计数将不为3。第二个人将有一个2的计数。第三个人不会出现在结果中,因为第二个产品是B。此查询也将在特定的日期范围内运行(例如,2014年1月1日-2014年10月27日)

我的产品是用MySQL和PHP编写的,我更愿意只在MySQL中编写,但这更像是OLAP问题。我非常感谢您的指导

另一个关键是,一旦两个记录满足条件,它们就不应该再次添加到计数中

这不是关系。为了使其有意义,我们必须定义对记录求值的顺序。虽然SQL确实有ORDER BY,但这仅用于显示目的。它不影响查询的计算顺序。评价的顺序并不重要

我认为这根本不能用
SELECT
查询来表达。如果我是对的,那就剩下plSQL或非SQL语言了

如果您愿意放弃这个需求(或者在后处理中实现它,请参见下文),那么这是可行的。从所有相关日期范围的视图开始:

CREATE VIEW date_ranges(
    start_date, -- DATE
    end_date -- DATE
) AS
SELECT DISTINCT date, DATE_ADD(date, INTERVAL 30 day)
FROM your_table;
现在,创建相关计数的视图:

CREATE VIEW product_counts(
    person, -- INTEGER REFERENCES your_table(person)
    count, -- INTEGER
    start_date, -- DATE
    end_date -- DATE
) AS
SELECT y.person,
    sum(y.quantity),
    r.start_date,
    r.end_date
FROM date_ranges r
JOIN your_table y
ON y.date BETWEEN r.start_date AND r.end_date
GROUP BY y.person
HAVING sum(y.quantity) > 1;

对于后期处理,您需要查看
产品\u计数
视图中的每一行,并查找与之对应的采购订单(您的\u表的行)。检查您以前是否见过这些订单(使用散列集),如果见过,请将其排除在考虑范围之外,减少当前项目的数量,并可能将其完全删除。这最好用SQL以外的过程语言来完成。

您能分享一下您的尝试吗?我甚至不知道从哪里开始专门在MySQL中完成这项工作。我可以在这个范围内每隔30天用php做一次嵌套循环,并建立一个集合。不过,这太残忍了。您始终可以创建一个存储过程。日期范围为2014年1月1日至2014年10月21日的预期输出是什么?日期范围为2014年11月1日至2014年1月21日的预期输出是什么?我想更好地理解这个请求。对于1/1-10/21,它将返回1:4,2:2。对于1/11-1/21,它将返回相同的结果,因为我们将看到1/11+30天到1/21+30天。1/25不在开始日期范围内这一事实无关紧要,因为它在d+30.0范围内。我希望有一个关系解决方案,但我相信你是对的。