PHP ARRAY根据日期范围显示数组中的分组数据

时间:2012-02-08 01:39:15

标签: php mysql arrays range

我有这个查询

$query = mysql_query ("SELECT type, count(*), date FROM tracking WHERE htcode='$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') GROUP BY type, date ORDER BY date ASC");

此代码:

while ($result = mysql_fetch_assoc($query)){
echo $result['date'] .' / ' .$result['type'].' = ' .$result['count(*)'];
echo '<br>';
}

给了我:

2012-02-01 / viewed = 2
2012-02-03 / emailed = 1
2012-02-04 / shared = 1
2012-02-05 / viewed = 1
2012-02-07 / viewed = 2
2012-02-07 / shared = 3
2012-02-07 / emailed = 1
2012-02-07 / printed = 1

我如何获取查询数组并为今天,昨天以及日期范围(例如过去30天)提取所有(查看,共享,通过电子邮件发送,打印,使用过的)

1 个答案:

答案 0 :(得分:1)

要获取特定日期范围的所有结果,请勿按日期分组;而是使用WHERE子句来限制计数的日期。否则查询非常相似。

$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");

为了清晰起见,这里只是将查询本身格式化为多行:

SELECT type, count(*)
FROM tracking
WHERE htcode = '$htG'
  AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used')
  AND date >= '$start_date' AND date <= '$end_date'
GROUP BY type

请务必先确定$start_date$end_date的值。例如,今天你只需将它们都设置为:

$start_date = date('Y-m-d');
$end_date = date('Y-m-d');

请注意,date('Y-m-d')只是今天的日期,格式为YYYY-MM-DD

对于昨天,您将昨天的时间戳传递到date()函数,但使用相同的格式:

$start_date = date('Y-m-d', strtotime('yesterday'));
$end_date = date('Y-m-d', strtotime('yesterday'));

在过去的30天里,你将在30天前开始并在今天结束:

$start_date = date('Y-m-d', strtotime('30 days ago'));
$end_date = date('Y-m-d');

对于任何开始/结束日期,您都可以这样做。请注意,我正在使用strtotime(),它允许您使用大量英语短语来指定时间戳,而不必进行日期算术。

此外,由于您将多次执行查询,因此将逻辑分离到其自己的函数中可能是有意义的:

function report_range($htG, $start_date, $end_date) {
    $query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");

    while ($result = mysql_fetch_assoc($query)){
        echo $start_date . '-' . $end_date . ' / ' . $result['type'] . ' = '  . $result['count(*)'];
        echo '<br>';
    }
}

然后用这样的东西运行它(在这个例子中是最后30天):

report_range($htG, date('Y-m-d', strtotime('30 days ago')), date('Y-m-d'));