@Strontium

Как правильно сформировать запрос MYSQL?

Сразу скажу , только начал изучать MYSQL, так что сильно не пинайте за глупость вопроса.
Есть метеостанция, которая раз в минуту пишет данные в базу.
В базе 3 таблицы: bmp_pressure, bmp_temperature, humidity.
В каждой таблице 3 столбца
VALL_INDEX, DATESTAMP,DATA_SENSOR. Хочется получить ответ вида VALL_INDEX , DATESTAMP,DATA_SENSOR.bmp_pressure, DATA_SENSOR.bmp_temperature, DATA_SENSOR.humidity.
При этом хочется научится делать запрос как на получение данных на текущее время,так и получить выботку текущее значение и заначения за последниее 24 часа, но не за кажду минуту а за час. Должна получится вот такая табличка:
5ca8b7a578b65772287340.png
для получения текущих значений составил вот такой запрос:
SELECT bmp_pressure.val_index ,bmp_pressure.datestamp,bmp_pressure.data_sensor, bmp_temperature.data_sensor, humidity.data_sensor FROM bmp_pressure, bmp_temperature, humidity WHERE bmp_pressure.val_index=bmp_pressure.val_index=humidity.val_index AND bmp_pressure.datestamp LIKE TIME_FORMAT( now(), '%Y-%m-%d %H:%i:%')
в ответ получаю:
25602 | 2019-04-06 17:13:02 | 751.88 | 26.30 | 42.53
но вместо ожидаемой одной строчки одна и таже строка повторяется 25000 раз, именно столько строк в моих таблицах. Поясните почему так? Почему не одна строка? И как получить 24 строчки данных с интервалом в 1 час одним запросом ?
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Запрос последних данных на момент dateTime:
SELECT `p`.`pressure`, `t`.`temperature`, `h`.`humidity`
  FROM (
    SELECT `DATA_SENSOR` AS `pressure`
      FROM `bmp_pressure`
      WHERE `DATESTAMP` <= :dateTime
      ORDER BY `DATESTAMP` DESC
      LIMIT 1
  ) AS `p`
  JOIN (
    SELECT `DATA_SENSOR` AS `temperature`
      FROM `bmp_temperature`
      WHERE `DATESTAMP` <= :dateTime
      ORDER BY `DATESTAMP` DESC
      LIMIT 1
  ) AS `t`
  JOIN (
    SELECT `DATA_SENSOR` AS `humidity`
      FROM `humidity`
      WHERE `DATESTAMP` <= :dateTime
      ORDER BY `DATESTAMP` DESC
      LIMIT 1
  ) AS `h`
Запрос усреднённых почасовых данных за указанную дату date:
SELECT `p`.`hour`, `p`.`pressure`, `t`.`temperature`, `h`.`humidity`
  FROM (
    SELECT HOUR(`DATESTAMP`) AS `hour`, `DATA_SENSOR` AS `pressure`
      FROM `bmp_pressure`
      WHERE `DATESTAMP` BETWEEN :date AND :date + INTERVAL 1 DAY
      GROUP BY HOUR(`DATESTAMP`)
  ) AS `p`
  JOIN (
    SELECT `DATA_SENSOR` AS `temperature`
      FROM `bmp_temperature`
      WHERE `DATESTAMP` BETWEEN :date AND :date + INTERVAL 1 DAY
      GROUP BY HOUR(`DATESTAMP`)
  ) AS `t` ON `t`.`hour` = `p`.`hour`
  JOIN (
    SELECT `DATA_SENSOR` AS `humidity`
      FROM `humidity`
      WHERE `DATESTAMP` BETWEEN :date AND :date + INTERVAL 1 DAY
      GROUP BY HOUR(`DATESTAMP`)
  ) AS `h` ON `h`.`hour` = `p`.`hour`
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы