2017-04-23 50 views
0

我的表SQL查询不同最大值与日期

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; 

它运作良好,但现在我需要选择每一个最小和最大价值取决于“日期时间”。当然,我可以查询数据库中的每个最大值和最小值,但这不是一个漂亮的解决方案。有两个querys可以做到这一点吗?

编辑: 都querys的电流输出存储在数据阵列

$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] => 
      ) 
) 
+1

你能告诉我们期望从表中的输出? –

+0

请向我们展示您的预期产出。请注意,结果集可能不像您当前的那样干净,因为最高温度,湿度和压力可能出现在不同的记录中。 –

回答

2

我要建议你用六个查询来做这件事,通过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 
. . . 

这比较麻烦一些,但是您可以返回测量表中您想要的每个值的所有列。因此,例如,您也可以在最高温度下获得湿度。

0

你可以使用一个跟你一致结果表和测量

$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 " ;