Php 循环SQL查询

Php 循环SQL查询,php,sql,sqlite,loops,average,Php,Sql,Sqlite,Loops,Average,我在一个基于树莓的家庭气象站工作。目前,我正在制作一个显示过去几天平均温度的表格。我是这样工作的: 数据存储在SQLite3数据库中,页面由PHP生成。 我在PHP中做一个循环,以获得每个周期的平均温度,在每个PHP循环周期中,我做一个SQL查询,更改$starttime和$endtime的值: SELECT avg(t1),avg(t2) FROM temperatures WHERE time_stamp BETWEEN $starttime AND $endtime 它工作正常

我在一个基于树莓的家庭气象站工作。目前,我正在制作一个显示过去几天平均温度的表格。我是这样工作的: 数据存储在
SQLite3
数据库中,页面由PHP生成。 我在PHP中做一个循环,以获得每个周期的平均温度,在每个PHP循环周期中,我做一个SQL查询,更改
$starttime
$endtime
的值:

SELECT avg(t1),avg(t2) FROM temperatures WHERE time_stamp 
    BETWEEN $starttime AND $endtime
它工作正常,但由于多个SQL查询,性能很差(每天显示4个值的一周数据时,页面生成时间为30秒;每天显示1个值时,页面生成时间仅为5秒)

我是否可以编写一个SQL查询来完成PHP中没有循环的所有工作

编辑:
PHP代码:

        $db = new SQLite3('/home/pi/temperature.db');


    for ($i = $INTERVAL; $i <= $PERIOD; $i+=$INTERVAL)
    {
            $starttime = sprintf("datetime('now','-%d minutes')", $i-$INTERVAL);
            $endtime   = sprintf("datetime('now','-%d minutes')", $i);

            $sqlquery  = "SELECT avg(t1),avg(t2) FROM temperatura where ts_utc between ".$endtime." and ".$starttime.";";

            $sqlresult = $db->query($sqlquery);

            $row = $sqlresult->fetchArray();

            $starttime = sprintf("datetime('now','-%d minutes','localtime')", $i-$INTERVAL);
            $endtime   = sprintf("datetime('now','-%d minutes','localtime')", $i);


            $sqlquery = 'select strftime("%H:%M",'.$starttime.");";
            $sqlresult = $db->query($sqlquery);
            $starttime = $sqlresult->fetchArray();

            $sqlquery = 'select strftime("%H:%M",'.$endtime.");";
            $sqlresult = $db->query($sqlquery);
            $endtime = $sqlresult->fetchArray();

            echo $endtime[0]."-".$starttime[0];
            echo sprintf("  %2.1f",($row["avg(t1)"]/1000))."&deg;C    ".sprintf("%2.1f",($row["avg(t2)"]/1000))."&deg;C<br>";
    }
$db=newsqlite3('/home/pi/temperature.db');
对于($i=$INTERVAL;$i查询($sqlquery);
$row=$sqlresult->fetchArray();
$starttime=sprintf(“datetime('now','-%d分钟','localtime'),$i-$INTERVAL);
$endtime=sprintf(“datetime('now','-%d分钟','localtime'),$i);
$sqlquery='选择strftime(“%H:%M”,'。$starttime.);';
$sqlresult=$db->query($sqlquery);
$starttime=$sqlresult->fetchArray();
$sqlquery='选择strftime(“%H:%M”,“.$endtime.”);
$sqlresult=$db->query($sqlquery);
$endtime=$sqlresult->fetchArray();
echo$endtime[0]。“-”$starttime[0];
echo sprintf(“%2.1f”、($row[“avg(t1)”]/1000)).“°;C”;sprintf(“%2.1f”、($row[“avg(t2)”]/1000)).“°;C
”; }

时间戳(ts)字段是datetime类型

您可以使用
UNION
编写单个查询,但我非常确定请求的数量不是问题所在,一个请求5秒的速度太慢了

我会的

  • 确保时间戳上有索引
  • 检查索引是否使事情变得更好(
    EXPLAIN
    对查询可能有帮助)
  • 如果仍然很慢,则获取所有必需的数据并使用PHP计算平均值

  • 假设ts_utc是一个日期时间

    Select avg(t1) as t1_avg, avg(t2) as t2_avg, 
    Date(ts_utc) as measurement_Date, 
    Cast((Hour(ts_utc) / 2) as int) as measurement_Hour 
    From temperatura
    Group by Date(ts_utc),Cast((Hour(ts_utc) / 2) as int)
    Where ts_utc >= Date_sub(CURRENT_DATE(), interval 7 days)
    

    注意:没有检查sillies。特别是特定于mysql的…

    你能显示你的PHP代码吗?那么你想要过去n天内的平均每天数吗?哦,时间戳是什么类型的?@Tony Hopkins,假设我想一周内每天平均12次。5秒代表7次请求(每天一次)。我将查看UNION和index,看看它是如何运行的。根据您的编辑和发布的代码,您可以在无sql请求的情况下格式化时间!