MySQL - присоединение таблицы к себе, но с сохранением оригинальных результатов

0

У меня есть следующий запрос:

   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

Таблица выглядит следующим образом:

  • graph_value_id (int)
  • graph_id (int)
  • значение (float)
  • date_time (datetime)
  • date_created (datetime)
  • date_updated (временная метка)

Если я удалю LEFT JOIN (и все ссылки на него), результаты запроса верны.

Проблема, с которой я сталкиваюсь, заключается в том, что SUM (a. value) сильно искажается.

Единственной причиной, по которой я присоединился ко второй таблице, является то, что я могу получить даты MIN и MAX для одного и того же набора данных.

Кто-нибудь знает, как я могу это сделать?

Теги:

1 ответ

1
Лучший ответ

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

Решение. Используйте один производный запрос для выполнения вашей суммы, другой производной таблицы, чтобы получить 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
  • 0
    У вас есть пример или учебник, которым я мог бы следовать, чтобы сделать что-то подобное? Не уверен, как это сделать.
  • 0
    @Kerry: я опубликовал пример кода. Я думаю, вы найдете это в любой книге по SQL.
Показать ещё 1 комментарий

Ещё вопросы

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