webentwicklung-frage-antwort-db.com.de

MySQL Update-Abfrage mit linker Verknüpfung und Gruppierung nach

Ich versuche, eine Aktualisierungsabfrage zu erstellen und mache nur geringe Fortschritte bei der richtigen Syntax. Die folgende Abfrage funktioniert:

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 wird eine Liste von Triplets Index1, Index2, EventCounts erstellt. Dies geschieht nur für den Fall, dass t.SpecialEventCount NULL ist. Die Aktualisierungsabfrage, die ich zu schreiben versuche, sollte diesen SpecialEventCount auf diesen Zähler setzen, d. H. COUNT (m.EventType) in der obigen Abfrage. Diese Zahl kann 0 oder eine beliebige positive Zahl sein (daher der linke Join). Index1 und Index2 sind in Tabelle t zusammen eindeutig und werden zum Identifizieren von Ereignissen in MEvent verwendet.

Wie muss ich die Auswahlabfrage ändern, um eine Aktualisierungsabfrage zu werden? Das heißt etwas wie

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

aber ich bin verwirrt, was ich wo hinstellen soll und habe mit zahlreichen unterschiedlichen Vermutungen versagt.

45
Rob

Ich gehe davon aus, dass (Index1, Index2) Ein eindeutiger Schlüssel für Table ist, andernfalls würde ich erwarten, dass der Verweis auf t.SpecialEventCount Zu einem Fehler führt.

Die Abfrage wurde bearbeitet, um die Unterabfrage zu verwenden, da sie mit GROUP BY Nicht funktioniert hat.

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
81
Hammerite

Wenn Sie mit einer Unterabfrage einen Link-Join ausführen, wird eine riesige temporäre Tabelle im Arbeitsspeicher generiert, die keine Indizes enthält.

Versuchen Sie bei Aktualisierungen, Verknüpfungen zu vermeiden und stattdessen korrelierte Unterabfragen zu verwenden:

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

Führen Sie eine Profilerstellung durch, die jedoch in einigen Fällen erheblich schneller sein kann.

4
zvibo

mein beispiel

update card_crowd  as cardCrowd
LEFT JOIN 
(
select cc.id , count(1) as num
from card_crowd cc LEFT JOIN 
card_crowd_r ccr on cc.id = ccr.crowd_id
group by cc.id
) as tt
on cardCrowd.id = tt.id
set cardCrowd.join_num = tt.num;
1
riverfan