Php 如何通过MySQL计算具有日期间隔的统计信息

Php 如何通过MySQL计算具有日期间隔的统计信息,php,mysql,sql,Php,Mysql,Sql,我想计算一些按日期和动态间隔(周、月、年)排序的统计数据(使用MySQL后端)。 下面是一个小例子: Mysql表: 跟踪器点击 | ID | SITE_ID | CREATED_AT | | ---- |---------| --------------------| | 153 | 2 | 2013-07-22 15:43:25 | | 154 | 2 | 2013-07-25 16:45:46 | | 2501 | 2 | 20

我想计算一些按日期和动态间隔(周、月、年)排序的统计数据(使用MySQL后端)。 下面是一个小例子:

Mysql表: 跟踪器点击

| ID   | SITE_ID | CREATED_AT          |
| ---- |---------| --------------------|
| 153  | 2       | 2013-07-22 15:43:25 |
| 154  | 2       | 2013-07-25 16:45:46 |
| 2501 | 2       | 2013-09-15 17:45:48 |
我想通过一个查询按站点ID按周获取上个月的总点击数 去年每月都是一样的

上个月我每周想要什么的一个例子是:

| click number   | SITE_ID | BEGIN_DATE           | END_DATE            |
|----------------|---------|----------------------|---------------------|
| 25             |    2    |  2013-07-01 00:00:00 | 2013-07-08 00:00:00 |
| 19             |    2    |  2013-08-09 00:00:00 | 2013-08-16 00:00:00 |
| 53             |    2    |  2013-0717- 00:00:00 | 2013-08-24 00:00:00 |
我不知道是否有一种解决方案可以只使用一个查询而不使用任何其他进程来获取这个数组

多谢各位

SELECT count(*), site_id, extract(WEEK from created_at) as start_date, 
date_add(extract(WEEK from created_at), 1, week) as end_date
FROM click_tracker
GROUP BY site_id, extract(WEEK from created_at)

此外,您还可以添加where子句来过滤结果。

这应该可以获取上个月(即,过去4周)的计数,包括每个站点id的计数为0的周数。如果您有一个站点表来获取站点id,则表示对子查询的交叉连接可以替换为对表的简单交叉连接

这将生成一个从0到5的数字范围,并从当前日期减去该周数,设置相应的格式以给出结果周的星期日和星期六,并检查结果周是否介于当前日期和当前日期之间减去1个月(这样做,而不是仅仅减去4周,以应付可变长度的月份)

一年中的几个月也可以进行类似的查询

SELECT Months.aMonth_start, Months.aMonth_end, all_site_id.site_id, COUNT(tracker_click.id)
FROM
(
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i MONTH), '%Y/%m/01 00:00:00') AS aMonth_start,
            DATE_FORMAT(LAST_DAY(DATE_SUB(NOW(), INTERVAL units.i MONTH)), '%Y/%m/%d 23:59:59') AS aMonth_end
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11)units
) Months
CROSS JOIN
(
    SELECT DISTINCT site_id
    FROM tracker_click
) AS all_site_id
LEFT OUTER JOIN tracker_click
ON tracker_click.CREATED_AT BETWEEN Months.aMonth_start AND Months.aMonth_end
AND tracker_click.site_id = all_site_id.site_id
GROUP BY Months.aMonth_start, Months.aMonth_end, all_site_id.site_id

为此,假设您希望列出计数为零的月份,生成所需时间段的列表,然后将数据加入其中。感谢您的回答Kickstart,我有正确的行号,日期也正确,但跟踪计数不正确,每行给我一个错误的点击计数。我在中只有一行站点954的我的表格除了最后一行(1)外,跟踪器计数应始终为0。似乎“计数(跟踪器单击id)”每次都对所有行进行计数,而不仅仅是每个日期之间的行。我看不出有错误(尽管我可能遗漏了某些内容)。您可以在SQL fiddle上设置表格和少量数据来演示它吗?再次感谢您的帮助Kickstart,您可以在这里找到一个示例,我有一个where子句(第16行)为了只得到一个站点的结果,但无论站点id如何,查询都会返回相同的点击量。此查询非常复杂,我并不擅长SQL,也许这项工作很好,但我没有添加正确的where子句…where子句=>“where all\u site\u id=813”啊,看到问题了。左外连接的ON子句也应该在site_id上连接。我已经修改了上面的答案来纠正这个缺失的部分。希望这能解决问题。
SELECT Months.aMonth_start, Months.aMonth_end, all_site_id.site_id, COUNT(tracker_click.id)
FROM
(
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i MONTH), '%Y/%m/01 00:00:00') AS aMonth_start,
            DATE_FORMAT(LAST_DAY(DATE_SUB(NOW(), INTERVAL units.i MONTH)), '%Y/%m/%d 23:59:59') AS aMonth_end
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11)units
) Months
CROSS JOIN
(
    SELECT DISTINCT site_id
    FROM tracker_click
) AS all_site_id
LEFT OUTER JOIN tracker_click
ON tracker_click.CREATED_AT BETWEEN Months.aMonth_start AND Months.aMonth_end
AND tracker_click.site_id = all_site_id.site_id
GROUP BY Months.aMonth_start, Months.aMonth_end, all_site_id.site_id