我正在使用基于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))."°C ".sprintf("%2.1f",($row["avg(t2)"]/1000))."°C<br>";
}
timestamp(ts)字段是日期时间类型
答案 0 :(得分:1)
您可以使用UNION
编写单个查询,但我很确定请求的数量不是问题,一个请求的5秒太慢
我会
EXPLAIN
可能有帮助)答案 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特定的......