2010-06-11 11 views
40

Ich versuche, eine Update-Abfrage zu erstellen und wenig Fortschritte bei der richtigen Syntax. Die folgende Abfrage funktioniert:MySQL Update-Abfrage mit linken Join und Gruppe von

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 

Es erstellt eine Liste von Tripletts Index1, Index2, EventCounts. Dies geschieht nur für den Fall, dass t.SpecialEventCount NULL ist. Die Aktualisierungsabfrage, die ich versuche zu schreiben, sollte diesen SpecialEventCount auf diese Anzahl festlegen, d. H. COUNT (m.EventType) in der obigen Abfrage. Diese Zahl könnte 0 oder irgendeine positive Zahl sein (daher die linke Verknüpfung). Index1 und Index2 zusammen sind einzigartig in Tabelle t und sie werden verwendet, um Ereignisse in MEvent zu identifizieren.

Wie muss ich die Select-Abfrage ändern, um eine Update-Abfrage zu werden? I.e. etwas wie

aber ich bin verwirrt was zu setzen wo und mit zahlreichen verschiedenen Vermutungen gescheitert sind.

Antwort

68

Ich nehme an, dass (Index1, Index2) ist ein eindeutiger Schlüssel auf Table, sonst würde ich erwarten, dass der Verweis auf t.SpecialEventCount zu einem Fehler führt.

Edited Abfrage Unterabfrage zu verwenden, da es nicht 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

Danke, sieht ähnlich wie viele Dinge, die ich versucht habe. Leider kommt der folgende Fehler zurück: # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax in der Nähe von "GROUP BY t.Index1, t.Index2" in Zeile 9 – Rob

+0

mit Version 5.0.90-Protokoll, wenn dies hilft – Rob

+1

bearbeitet, um stattdessen Unterabfrage verwenden – Hammerite

4

Doing links mit einer Unterabfrage kommt mit funktionierte eine Riese temporäre Tabelle im Speicher erzeugen, die keine Indizes haben.

Für Updates, versuchen Sie verbindet die Vermeidung und Abfragen anstelle korreliert werden:

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 

Sie einige der Profilierung, aber dies kann in einigen Fällen deutlich schneller sein.