Php SQL查询具有日期的不同最大值
我的桌子Php SQL查询具有日期的不同最大值,php,sql,database,sqlite,Php,Sql,Database,Sqlite,我的桌子 ID | sensornode | temperature | humidity | pressure | voltage | datetime 1 Node1 27.81 23.78 1029.7 3.321 2017-04-20 14:17:24 2 Node1 27.93 23.72 1029.7 3.321 2017-0
ID | sensornode | temperature | humidity | pressure | voltage | datetime
1 Node1 27.81 23.78 1029.7 3.321 2017-04-20 14:17:24
2 Node1 27.93 23.72 1029.7 3.321 2017-04-20 14:17:39
3 Node1 28.1 23.68 1029.8 3.321 2017-04-20 14:17:54
4 Node1 28.08 23.62 1029.7 3.321 2017-04-20 14:18:09
5 Node1 28.21 23.58 1029.8 3.321 2017-04-20 14:18:24
6 Node1 28.37 23.54 1029.7 3.321 2017-04-20 14:18:39
我需要选择温度、湿度和压力的最大值和最小值。这是选择最大值和最小值的PHP方法
public function getMaxMin($nodeId, $datetimestart, $datetimeend){
$values = array(
':nodeId' => $nodeId,
':datetimestart' => $datetimestart,
':datetimeend' => $datetimeend
);
$sqlmax = "SELECT
MAX(temperature) as temperature,
MAX(humidity) as humidity,
MAX(pressure) as pressure
FROM measurement
WHERE nodeId =:nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend";
$sqlmin = "SELECT
MIN(temperature) as temperature,
MIN(humidity) as humidity,
MIN(pressure) as pressure
FROM measurement
WHERE nodeId =:nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend";
$max = $this->queryDatabase($sqlmax, $values);
$min = $this->queryDatabase($sqlmin, $values);
$data = array('max' => $max[0],
'min' => $min[0]
);
return data;
它工作得很好,但现在我需要选择每个最小值和最大值的“日期时间”。当然,我可以查询数据库中的每个Max和Min值,但这不是一个很好的解决方案。有没有可能用两个查询来实现这一点
编辑:
两个查询的当前输出都存储在数据数组中
$data = Array
(
[max] => Array
(
[temperature] => 29.56
[humidity] => 74.23
[pressure] => 1029.02
)
[min] => Array
(
[temperature] => 7.61
[humidity] => 19.27
[pressure] => 1019.28
)
)
但我在寻找这个:
$data = Array
(
[max] => Array
(
[temperature] => 29.56
[t_datetime] =>
[humidity] => 74.23
[h_datetime] =>
[pressure] => 1029.02
[p_datetime] =>
)
[min] => Array
(
[temperature] => 7.61
[t_datetime] =>
[humidity] => 19.27
[h_datetime] =>
[pressure] => 1019.28
[p_datetime] =>
)
)
我建议您使用六个查询,通过
union all
连接:
SELECT *
FROM (SELECT 'max temperature' as which, temperature as value, datetime
FROM measurement
WHERE nodeId = :nodeID AND datetime BETWEEN :datetimestart AND :datetimeend
ORDER BY 2 DESC
LIMIT 1
) t
UNION ALL
SELECT *
FROM (SELECT 'min temperature' as which, temperature as value, datetime
FROM measurement
WHERE nodeId =:nodeID AND datetime BETWEEN :datetimestart AND :datetimeend
ORDER BY 2 ASC
LIMIT 1
) t
UNION ALL
. . .
这有点麻烦,但是您可以返回度量表中您想要的每个值的所有列。例如,您也可以获得最高温度下的湿度。我建议您使用六个查询,通过union all连接:
SELECT *
FROM (SELECT 'max temperature' as which, temperature as value, datetime
FROM measurement
WHERE nodeId = :nodeID AND datetime BETWEEN :datetimestart AND :datetimeend
ORDER BY 2 DESC
LIMIT 1
) t
UNION ALL
SELECT *
FROM (SELECT 'min temperature' as which, temperature as value, datetime
FROM measurement
WHERE nodeId =:nodeID AND datetime BETWEEN :datetimestart AND :datetimeend
ORDER BY 2 ASC
LIMIT 1
) t
UNION ALL
. . .
这有点麻烦,但是您可以返回度量表中您想要的每个值的所有列。例如,您可以获得最高温度下的湿度。您可以使用连接结果表和测量
$sqlmax = "
select a.temperature, a.humidity, a.pressure, b.datetime
from ( SELECT
MAX(temperature) as temperature,
MAX(humidity) as humidity,
MAX(pressure) as pressure
FROM measurement
WHERE nodeId =:nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend
) a inner join measurement as b on a.temperature = b.temperature
and a.humidity = b.humidity and a.pressure = b.pressure " ;
您可以使用结果表和度量的联接
$sqlmax = "
select a.temperature, a.humidity, a.pressure, b.datetime
from ( SELECT
MAX(temperature) as temperature,
MAX(humidity) as humidity,
MAX(pressure) as pressure
FROM measurement
WHERE nodeId =:nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend
) a inner join measurement as b on a.temperature = b.temperature
and a.humidity = b.humidity and a.pressure = b.pressure " ;
你能给我们看一下你表中的期望输出吗?请给我们看一下你的期望输出。请注意,结果集可能不如当前结果集干净,因为最高温度、湿度和压力可能出现在不同的记录中。能否显示表中的预期输出?请显示预期输出。请注意,结果集可能没有当前结果集干净,因为最高温度、湿度和压力可能出现在不同的记录中。