【问题标题】:SQL Query different Max values with dateSQL用日期查询不同的最大值
【发布时间】:2017-09-20 02:17:36
【问题描述】:

我的桌子

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] =>
            )
)

【问题讨论】:

  • 你能告诉我们你的桌子想要的输出吗?
  • 请向我们展示您的预期输出。请注意,结果集可能不如您当前的结果集干净,因为最高温度、湿度和压力可能出现在不同的记录中。

标签: php sql database sqlite


【解决方案1】:

我建议您使用六个查询来执行此操作,通过 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
. . .

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

【讨论】:

    【解决方案2】:

    您可以在结果表和测量中使用联接

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

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 2010-09-22
      • 1970-01-01
      • 2022-08-18
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2014-11-03
      相关资源
      最近更新 更多