1

我有一个记录 url 命中的表

目标是hitsparent天分组

parent代表url的id

time是由 PHP 生成的 inttime()

id | parent | time

到目前为止我提出的查询:(假设我想选择 item 2929

SELECT time, count( * ) AS hits
FROM `hits`
WHERE parent =2929
GROUP BY floor( time /86400 )
ORDER BY time ASC

现在的问题是,我只得到 5 行

time            hits
1355761244      9
1355791721      22
1355879697      23
1355966014      16
1356070906      24

因为 MySQL 不会返回 0 次点击的天数。

我怎样才能解决这个问题?

目标将是例如选择最后 7 天或 30 天或 365 天,以及接收0命中的天数

更新了查询以选择上个月的日期:

SELECT floor(time/86400) AS day, count( * ) AS hits
FROM `hits`
WHERE parent =2929
AND time > ONE_MONTH_AGO
GROUP BY day
ORDER BY time ASC
LIMIT 0 , 30

使用 Pharaoh 的 PHP 函数,这应该可以正常工作。

4

2 回答 2

2

由于没有命中的一天没有命中,因此这一天没有数据库条目 - 所以 MySQL 无法选择任何内容。
查询完成后,我会在 PHP 中执行此操作(“填充孔”)。

您可以像这样进行数据后处理:

for ($day=$minday; $day<=$maxday; $day++)
  if (!isset($sql_array[$day]))
    $sql_array[$day]=0;

或者您在echoing 数据时直接执行此操作:

for ($day=$minday; $day<=$maxday; $day++)
  if (!isset($sql_array[$day]))
    echo 0;
  else
    echo $sql_array[$day];

我假设$day是一个整数,计算天数,你必须修改它以满足你的需要。

于 2012-12-22T13:52:16.820 回答
1

以时间戳的形式设置您的开始日期和结束日期,并使用 PHP range() 函数创建这些时间戳的数组。将数组中的值设置为零,然后将查询结果集映射到数组中。像这样得到零数组的东西。

<?php // RAY_temp_foo.php
error_reporting(E_ALL);
date_default_timezone_set('America/Chicago');

$old = strtotime('September 15, 2012');
$now = strtotime('October 15, 2012');
$day = 60*60*24;
$arr = range($old, $now, $day);
$new = array_flip($arr);
foreach ($new as $key => $nul) $new[$key] = 0;
var_dump($new);

您可能需要标准化您的“时间”值以与数组中的键对齐,以便它们代表每天的开始秒。

于 2012-12-22T14:02:08.137 回答