我正在尝试为 PHP 中的图表生成数据,该图表显示特定时间范围内按小时分割的 mysql 表中的记录量。每条记录都有一个 unix 时间戳。
例如,假设我想显示今天的统计数据。下面的代码“有效”,但在运行它并查看我所做的之后,它只是碰巧起作用的可怕的胡言乱语。当我在具有数百万条索引记录的表上运行它时,速度很慢www。
它现在所做的是每小时执行一次查询,直到达到 24 小时。问题是我试图同时从多达 10 个其他表中提取数据。这意味着我可能会在每次页面加载时运行多达 240 个查询,这并不好。
$c = '0';
$h = '1';
while($h < 25){
$hr_start = 3600 * $c;
$hr_stop = 3600 * $h;
$query = "SELECT `reason`,`timestamp`
FROM `c_blacklist`
WHERE `timestamp` > '".strtotime('today')."' + ".$hr_start." AND `timestamp` < '".strtotime('today')."' + ".$hr_stop." AND `reason` = 'hardbounce'";
$result = mysql_query($query) or die(mysql_error());
$hardbounce_count = mysql_num_rows($result);
$dataset5[] = array($h,$hardbounce_count);
$h++;
$c++;
}
我知道有更好的方法可以做到这一点,但我无法找到太多相关信息。有没有办法运行 1 个查询,然后让 PHP 按小时分解它并插入到数据集中?我很困惑,我很感激任何帮助。谢谢。
最佳答案
您可以创建一种“报告查询”,在调用时会为您提供过去 24 小时的数据。
第一步是创建一个包含 24 行的引用表,其中包含数字 1-24(或 0-23,具体取决于您的逻辑)。我将此表称为 hours
。通过使用此引用表,如果在给定小时内未发生任何事件,您仍将获得 0 计数。这与仅对时间戳执行 GROUP BY 的方法不同。
然后,使用 TIMEDIFF
的组合和 HOUR
left join 到这个表的函数。像这样的东西(未经测试但你明白了):
SELECT
COUNT(c_blacklist.reason) as num_reasons,
hours.hour as hour
FROM hours
LEFT JOIN c_blacklist
ON HOUR(TIMEDIFF(now(), c_blacklist.timestamp)) = hours.hour
GROUP BY hours.hour
这将输出 24 行,其中包含过去 24 小时中每一小时的“原因”数。如果需要,您可以很容易地添加一些时间戳
关于php - 如何从 mysql 表中显示每小时统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214191/