优化MYSQL, PHP搜索记录在这个确切的时间数天前


Optimize MYSQL, PHP search for records at this exact time a number of days ago

我正在尝试获得一个优化的查询,该查询可以在任何前一天的同一时间或几天内为我提供结果。我能够解决它与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;

在间隔内的每一天的子选择中,我将计算表达式的最小值,并使用最小值将其连接回外部查询到统计表。唯一需要注意的是,如果您有多条记录且差异最小,那么将返回所有这些记录。

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()))代替日期减法来获得前一天的相同时间。

作为备选版本:

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天。