Объединить MySQL Queries в таблицу

0

У меня есть таблица, которую я попытался сделать настолько эффективной, насколько могу, чтобы разрешить одну запись для каждой точки данных в таблице и связать тип записи с другой таблицей и местоположение в третьей таблице.

Это по существу означает, что в таблице датчиков я определяю местоположение датчика и идентификатора датчика, в тестовой таблице я определяю тесты, которые могут выполняться, идентификатор теста, единицы измерения, имя теста и верхний и нижний пределы и в итоговой таблице (таблица данных) я ссылается на идентификатор записи, текущий 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 для каждого тестового имени.

Большое спасибо!

Теги:

1 ответ

0

Я думаю, вам просто нужен базовый опорный запрос:

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;
  • 0
    Есть ли способ, чтобы MAX (Case ...) был динамичным, в идеале, я хотел бы иметь запрос в PHP и не нужно менять тесты, но это, кажется, требует жестко закодировать тесты, могу ли я как-то вытащить имена тестов из запроса (например, SELECT DISTINCT testname FROM t) и вводить их в сводный запрос? -- Большое спасибо!
  • 0
    @ user1829564 Для этого вам понадобится динамический SQL, и у меня нет опыта работы с динамическим SQL в PHP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню