循环SQL查询

时间:2013-12-28 10:07:33

标签: php sql sqlite loops average

我正在使用基于RaspberryPi的家庭气象站。目前我正在努力展示一张平均温度在过去几天的桌子。我这样做了: 数据存储在SQLite3数据库中,页面使用PHP生成。 我在PHP中进行循环以获得每个时段的平均温度,并且在每个PHP循环周期中我正在执行SQL查询,更改$starttime$endtime的值:

SELECT avg(t1),avg(t2) FROM temperatures WHERE time_stamp 
    BETWEEN $starttime AND $endtime

它工作正常,但由于多次SQL查询(30秒页面生成时间显示周数据每天4个值,而且每天有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>";
    }

timestamp(ts)字段是日期时间类型

2 个答案:

答案 0 :(得分:1)

您可以使用UNION编写单个查询,但我很确定请求的数量不是问题,一个请求的5秒太慢

我会

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

答案 1 :(得分:0)

假设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特定的......