2010-06-11 47 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,索引2,EventCounts的列表。 它僅在t.SpecialEventCount爲NULL的情況下執行此操作。我正在嘗試編寫的更新查詢應將此SpecialEventCount設置爲該計數,即上述查詢中的COUNT(m.EventType)。這個數字可以是0或任何正數(因此左連接)。索引1和索引2一起在表t中是唯一的,它們用於識別MEvent中的事件。

如何修改select查詢以成爲更新查詢?即像

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

但我很困惑什麼把放在哪裏和失敗與無數不同的猜測。

回答

68

我認爲(Index1, Index2)Table上的唯一鍵,否則我會期待引用t.SpecialEventCount導致錯誤。

編輯查詢中使用子查詢,因爲它並沒有使用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 2010-06-11 12:51:53

+0

使用版本5.0.90-log如果這有幫助 – Rob 2010-06-11 13:11:08

+1

編輯爲使用子查詢 – Hammerite 2010-06-11 14:52:56

4

做一個左一個子查詢聯接將產生在內存中一個巨大的 臨時表中,將有沒有索引工作。

對於更新,儘量避免連接和使用相關子查詢 改爲:

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 

做一些分析,但是這可能在某些情況下是顯著更快。