我试图获得一个优化的查询,该查询在前一天或同一天的同一时间给我结果。我能够通过PHP循环重复查询来解决它,该查询给出了特定日期的结果,但这需要很长时间。
我的PHP代码和MYSQL查询:
$json_data = array();
$i=$range;
while ($i>0){
$result=mysql_query("SELECT numpeople, numviews, date FROM table_stats ORDER BY ABS(date - DATE_SUB(NOW(), INTERVAL '$i' DAY)) LIMIT 1", $conn);
while($r = mysql_fetch_assoc($result)){
$json_data[]= $r;
}
$i--;
}
print json_encode($json_data);
return;
答案 0 :(得分:1)
在区间中每天的子选择中,我将计算表达式的最小值,并使用最小值将其连接到您的统计表的外部查询中。唯一的问题是,如果您有多个具有最小差异的记录,那么将返回所有记录。
select numpeople, numviews, date
FROM table_stats
inner join
(select date(date) dd, min(ABS(date - DATE_SUB(NOW(), INTERVAL (datediff(curdate(), date)) DAY))) as mindiff
from table_stats
where date(date)<=curdate() - 1 and date(date)>=curdate() - interval $range day
group by date(date)) t
on t.dd=date(table_stats.date)
and t.mindiff=ABS(table_stats.date - DATE_SUB(NOW(), INTERVAL (datediff(curdate(), table_stats.date)) DAY))
在abs()
表达式中,您可以使用concat(date(date), ' ', time(now()))
代替日期减法来获取前一天的相同时间。
答案 1 :(得分:0)
作为替代版本:
SELECT numpeople, numviews, `date` FROM table_stats
WHERE `date` < NOW() - INTERVAL $n DAY -- where $n is the max range
AND TIME(`date`) BETWEEN TIME(NOW()) - INTERVAL 5 MINUTE AND TIME(NOW()) + INTERVAL 5 MINUTE
ORDER BY date DESC
LIMIT 1
查找距离当前时间+/- 5分钟的所有记录,最长为$n
天前。