@i_goodwin

Как написать запрос MySQL или обработать в PHP для получения массива нужного вида?

Доброго дня! К сути: есть база данных "mqtt", таблица "topics" в ней. В базу каждую минуту посредством MQTT прилетают данные от esp8266 с показаниями температуры (топик tempinroom) и влажности (топик huminroom) в комнате; и записываются в таблицу. Вид таблицы "topics" следующий:

+----+---------------------+------------+-------+
| id | time                | topic      | value |
+----+---------------------+------------+-------+
|  1 | 2018-09-02 12:27:13 | tempinroom |  24.2 |
|  2 | 2018-09-02 12:27:13 | huminroom  |  56.8 |
|  3 | 2018-09-02 12:28:13 | tempinroom |    24 |
|  4 | 2018-09-02 12:28:13 | huminroom  |  57.5 |
|  5 | 2018-09-02 12:29:13 | tempinroom |  23.9 |
+----+---------------------+------------+-------+


Сейчас озадачился построением графика изменений этих параметров с помощью HighCharts. График одной из величин (любой) построить удается. Для этого формируется файл json.php следующего содержания:
<?php 
date_default_timezone_set('UTC');
$link = mysqli_connect('localhost', "***", '***');
if (!$link)
    echo ("Ошибка соединения с базой данных");
mysqli_select_db($link, "mqtt") or die("Невозможно открыть базу данных"); 

$result = mysqli_query($link,
    'SELECT id,time,topic,value FROM `topics` WHERE topic = "tempinroom"');

while ($i = mysqli_fetch_row($result))
{
	$all[] = array(strtotime($i[1]), (float)$i[3]);
}
echo json_encode($all);
mysqli_close($link); 
?>

На выходе получаем массив вида
[[1535891233,24.2],[1535891293,24],[1535891353,23.9]]

т.е. в массиве есть только время в Unix-формате и значение (в данном случае - температуры).

Вопрос: каким образом получить массив вида
[[time1, tempinroom1, huminroom1],[time2, tempinroom2, huminroom2]]

Время записи пары значений - влажности и температуры - одинаково, как можно видеть по таблице. Быть может, решение где-то на поверхности, но опыта у меня пока мало. Ломаю голову уже 3 дня, гугл перегуглил)
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
0xD34F
@0xD34F
Вариантов тут несколько:
  • Так как значения у вас парные - измените структуру БД, пусть оба значения лежат в одной строке
  • Путь дурака: два запроса в PHP и ручное объединение их результатов - цикл по первому массиву, вложенный цикл по второму, как встретился элемент с таким же значением time, его value добавляется в элемент из первого массива
  • Получить данные одним запросом:
    SELECT t1.time, t1.value AS temp_val, t2.value AS hum_val
    FROM topics t1
    JOIN topics t2 ON t2.time = t1.time
    WHERE
      t1.topic = 'tempinroom' AND
      t2.topic = 'huminroom'

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы