2017-04-23 5 views
0

Mein TischSQL Query verschiedener Max-Wert mit Datum

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 

I benötigt, um den Max & Min Werte von Temperatur, Feuchtigkeit und Druck auszuwählen. Dies ist die PHP-Methode, um den max auszuwählen und min

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; 

Es funktionierte gut, aber jetzt brauche ich jedes min und max-Wert den je ‚Datetime‘ zu wählen. Natürlich könnte ich die Datenbank nach jedem Max- und Min-Wert abfragen, aber es wäre keine schöne Lösung. Gibt es eine Möglichkeit, dies mit zwei Abfragen zu tun?

Edit: Die aktuelle Ausgabe beider querys in der Daten Array gespeichert sind

$data = Array 
(
    [max] => Array 
     (
      [temperature] => 29.56 
      [humidity] => 74.23 
      [pressure] => 1029.02 
     ) 
    [min] => Array 
     (
      [temperature] => 7.61 
      [humidity] => 19.27 
      [pressure] => 1019.28 
     ) 

) 

Aber ich bin auf der Suche für diese:

$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

Können Sie zeigen uns Ausgabe von Ihrem Tisch gewünscht? –

+0

Bitte zeigen Sie uns Ihre erwartete Leistung. Beachten Sie, dass die Ergebnismenge möglicherweise nicht so sauber ist wie Ihre aktuelle, da die maximale Temperatur, Feuchtigkeit und der Druck in verschiedenen Datensätzen auftreten können. –

Antwort

2

Ich schlage vor, werde, dass Sie tun dies mit sechs Abfragen, verbunden durch 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 
. . . 

Dies ist ein wenig mühsamer, aber Sie können alle Spalten in der Maßtabelle, die Sie für jeden Wert möchten, zurückgeben. So können Sie beispielsweise auch die Luftfeuchtigkeit auf die maximale Temperatur bringen.

0

könnten Sie ein, mit Ihnen Tisch und Messung führen

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