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))."°C ".sprintf("%2.1f",($row["avg(t2)"]/1000))."°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
对查询可能有帮助)假设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请求的情况下格式化时间!