php - 如何从 mysql 表中显示每小时统计信息

标签 php mysql date time

我正在尝试为 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/

相关文章:

php - 匹配php中一组字符中的字符

php - PHP PDO 语句可以接受表名或列名作为参数吗?

mysql - 如何从具有这些条件的表中进行选择?

php - 使用 PHP 返回表名

java - 解析非标准日期格式,如 "+0yyyyMMdd"

php - php中具有相同输入名称的多次插入

php - 多域一 session 无脂框架

php - wamp 无法加载 mysqli 扩展

php - 在 PHP 中找出 2 个日期是否在同一个月的最佳方法是什么?

java - Java 中基于时间的逻辑单元测试