У меня есть таблица, которую я попытался сделать настолько эффективной, насколько могу, чтобы разрешить одну запись для каждой точки данных в таблице и связать тип записи с другой таблицей и местоположение в третьей таблице.
Это по существу означает, что в таблице датчиков я определяю местоположение датчика и идентификатора датчика, в тестовой таблице я определяю тесты, которые могут выполняться, идентификатор теста, единицы измерения, имя теста и верхний и нижний пределы и в итоговой таблице (таблица данных) я ссылается на идентификатор записи, текущий DATETIME, идентификатор датчика, testID и тестовое значение.
Это означает, что таблица имеет множество отдельных записей для каждого датчика и теста, но они могут возникать одновременно, например, один датчик может одновременно выводить до 4 тестов.
Я использую SELECT, как показано ниже, чтобы получить основную информацию;
SELECT raw_data.entry_date, sensorid.desk as location, tests.testname as test, raw_data.test_value as testresult
FROM raw_data
INNER JOIN sensorID ON raw_data.sensorID = SensorID.Sensor
INNER JOIN tests ON raw_data.test_id = tests.testid
ORDER BY entry_date ASC
Это хорошо работает, чтобы получить каждую запись или фильтровать с помощью теста, но она работает ужасно, если я пытаюсь сгруппировать все результаты по времени и дате. Есть ли способ сделать динамический результат MySQL, который представляет собой больше системы на основе столбцов, например
DATE | ДАТЧИК | TEST A из (test.testname) | TEST B... | TEST C... | TEST D...
Идея в этом заключалась бы в том, что в столбце TEST A будут представлены результаты для TEST A и т.д.
Я буду фильтровать, поэтому не будет запрашивать всю базу данных, а конкретный датчик/сайт и т.д., Но главное, как динамически это делать, поэтому мне не нужно каждый раз менять все имена столбцов и все такое?
В конце концов я хочу, чтобы это можно было передать в JSON, но мне нужно сгруппировать по DATE и Location и представить имена тестов по столбцам, а значения строк - test_value для каждого тестового имени.
Большое спасибо!
Я думаю, вам просто нужен базовый опорный запрос:
SELECT
r.entry_date,
s.desk AS location,
MAX(CASE WHEN t.testname = 'A' THEN r.test_value END) AS test_A,
MAX(CASE WHEN t.testname = 'B' THEN r.test_value END) AS test_B,
MAX(CASE WHEN t.testname = 'C' THEN r.test_value END) AS test_C
FROM raw_data r
INNER JOIN sensorID s
ON r.sensorID = s.Sensor
INNER JOIN tests t
ON r.test_id = t.testid
GROUP BY
r.entry_date,
s.desk
ORDER BY
r.entry_date;