选择按日分组的匹配,包括0次点击的天数

时间:2012-12-22 13:47:53

标签: php mysql

我有一个记录网址点击的表格

目标是让hits的所有parent按天分组

parent代表网址的ID

time是由PHP的time()

生成的int
id | parent | time

到目前为止我提出的查询:(假设我想要选择项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

使用法老的PHP功能,这应该可以正常工作。

2 个答案:

答案 0 :(得分:2)

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

要么像这样进行数据后处理:

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

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

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

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

答案 1 :(得分: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);

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