Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化MYSQL,PHP在几天前的这个时间搜索记录_Php_Mysql - Fatal编程技术网

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

优化MYSQL,PHP在几天前的这个时间搜索记录,php,mysql,Php,Mysql,我正在尝试得到一个优化的查询,它可以在任何前一天的同一时间或在一段时间内给出结果。我可以通过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

我正在尝试得到一个优化的查询,它可以在任何前一天的同一时间或在一段时间内给出结果。我可以通过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;

在间隔中的每一天的子选择中,我将计算表达式的最小值,并在外部查询中使用最小值将其连接回stats表。唯一的问题是,如果您有多个差异最小的记录,那么所有记录都将返回

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表达式中,您可以使用concatdatedate、timenow而不是日期减法来获得前一天的相同时间。

作为替代版本:

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天前)有一个条目的所有记录。

您不应该继续使用mysql函数。查看此答案:了解更多详细信息。这可能会很难看,但您可能会发现最快的方法是用php预先计算准确的时间范围,并在这些时间间隔上进行查询。您是对的,开始时不使用-INTERVAL$n DAY的查询速度要快得多,几乎可以给出答案,但不幸的是,它在同一天返回多行。如果没有,我可以将结果限制在一定范围内,因为所有结果都是从现在开始到过去的。谢谢这确实很有效,但如果我把范围设置为大于11,12或更多,它会返回所有结果。我猜这是因为它在几个月内发生了变化。。。我不知道足够的SQL来解决这个问题,但它要快得多。嗯,用curdate-interval$range-day替换curdate-range-day是的,这非常有效。非常感谢你。。。我试图解决这个问题已经有一段时间了。