2010-06-11 3 views
40

Я пытаюсь создать запрос на обновление и сделать небольшой прогресс в получении правильного синтаксиса. Следующий запрос работает:Запрос на обновление MySQL с левым соединением и группой по

SELECT t.Index1, t.Index2, COUNT(m.EventType) 
    FROM Table t 
    LEFT JOIN MEvents m ON 
     (m.Index1 = t.Index1 AND 
     m.Index2 = t.Index2 AND 
     (m.EventType = 'A' OR m.EventType = 'B') 
    ) 
    WHERE (t.SpecialEventCount IS NULL) 
    GROUP BY t.Index1, t.Index2 

Это создает список троек Индекс1, index2, Счетчики событий. Это делается только для случая, когда t.SpecialEventCount имеет значение NULL. Запросы обновления, которые я пытаюсь записать, должны установить этот SpecialEventCount в этот счет, то есть COUNT (m.EventType) в запросе выше. Это число может быть 0 или любое положительное число (следовательно, левое соединение). Index1 и Index2 вместе являются уникальными в таблице t, и они используются для идентификации событий в MEvent.

Как мне изменить запрос выбора, чтобы стать запросом обновления? То есть что-то вроде

UPDATE Table SET SpecialEventCount=COUNT(m.EventType)..... 

но я смущен, что положить туда и не удалось с множеством различных догадок.

ответ

68

Я полагаю, что (Index1, Index2) является уникальным ключом на Table, в противном случае я ожидал бы ссылки на t.SpecialEventCount, чтобы привести к ошибке.

Edited запроса использовать подзапрос, как он не работает с помощью GROUP BY

UPDATE 
    Table AS t 
    LEFT JOIN (
     SELECT 
      Index1, 
      Index2, 
      COUNT(EventType) AS NumEvents 
     FROM 
      MEvents 
     WHERE 
      EventType = 'A' OR EventType = 'B' 
     GROUP BY 
      Index1, 
      Index2 
    ) AS m ON 
     m.Index1 = t.Index1 AND 
     m.Index2 = t.Index2 
SET 
    t.SpecialEventCount = m.NumEvents 
WHERE 
    t.SpecialEventCount IS NULL 
+1

Спасибо, похоже на многие вещи, которые я пробовал. К сожалению, возвращается со следующей ошибкой: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'GROUP BY t.Index1, t.Index2' по строке 9 – Rob

+0

с использованием версии 5.0.90-log, если это помогает – Rob

+1

, отредактированный для использования подзапроса вместо – Hammerite

4

Выполнения LEFT JOIN с подзапросом будет генерировать гигантский временной таблицы в памяти, что не будет иметь никаких индексов.

Для обновлений, попытайтесь избежать соединений и используя коррелируют подзапросов вместо:

UPDATE 
    Table AS t 
SET 
    t.SpecialEventCount = (
     SELECT COUNT(m.EventType) 
     FROM MEvents m 
     WHERE m.EventType in ('A','B') 
      AND m.Index1 = t.Index1 
      AND m.Index2 = t.Index2 
    ) 
WHERE 
    t.SpecialEventCount IS NULL 

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

Смежные вопросы