我有一个记录网址点击的表格
目标是让hits
的所有parent
按天分组
parent
代表网址的ID
time
是由PHP的time()
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功能,这应该可以正常工作。
答案 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);
您可能需要将“时间”值标准化,以便与数组中的键对齐,以便它们代表每天的起始秒。