У меня есть следующий запрос:
SELECT a.`graph_value_id`,
SUM( a.`value` ) AS value,
DATE( DATE_ADD( a.`date_time`, INTERVAL 5 DAY ) ) AS date_time
FROM `graph_values` AS a
LEFT JOIN `graph_values` AS b ON ( a.`graph_id` = b.`graph_id` )
WHERE a.`graph_id` = 921
GROUP BY DATE( a.`date_time` )
HAVING date_time >= MIN( b.`date_time` ) AND date_time <= MAX( b.`date_time` )
ORDER BY a.`date_time` DESC
Таблица выглядит следующим образом:
Если я удалю LEFT JOIN (и все ссылки на него), результаты запроса верны.
Проблема, с которой я сталкиваюсь, заключается в том, что SUM (a. value
) сильно искажается.
Единственной причиной, по которой я присоединился ко второй таблице, является то, что я могу получить даты MIN и MAX для одного и того же набора данных.
Кто-нибудь знает, как я могу это сделать?
Проблема заключается в том, что вы эффективно создаете все совпадающие пары строк из двух таблиц и суммируете пары, что даст вам слишком высокий коэффициент.
Решение. Используйте один производный запрос для выполнения вашей суммы, другой производной таблицы, чтобы получить min и max, а затем присоедините две производные таблицы, чтобы получить результат.
SELECT T1.graph_id, T1.col1, T1.col2, T2.col1, ...
FROM (
SELECT graph_id, SUM(...) AS total
FROM ...
GROUP BY ...
) T1
JOIN (
SELECT graph_id, MIN(...) AS minfoo, MAX(...) AS maxfoo
FROM ...
GROUP BY ...
) T2
ON T1.graph_id = T2.graph_id