我有这个查询
$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天)提取所有(查看,共享,通过电子邮件发送,打印,使用过的)?
答案 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'));