51 votes

MySQL mise à Jour de la requête avec une jointure gauche et du groupe par

Je suis en train de créer une requête de mise à jour et de faire peu de progrès dans l'obtention de la bonne syntaxe. La requête suivante est de travail:

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

Il crée une liste de triplets Index1,Index2,EventCounts. Il ne fait cela pour le cas où t.SpecialEventCount est NULL. La requête de mise à jour, je suis en train d'écrire devez définir cette SpecialEventCount à qui comptent, c'est à dire le COMTE(m.EventType) dans la requête ci-dessus. Ce nombre pourrait être de 0 ou un nombre positif (d'où le left join). Index1 et Index2 ensemble sont uniques dans le Tableau t, et ils sont utilisés pour identifier les événements dans MEvent.

Comment dois-je modifier la requête select pour devenir une requête de mise à jour? I. e. quelque chose comme

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

mais je ne sais pas quoi mettre et où ont échoué avec de nombreuses différentes conjectures.

88voto

Hammerite Points 10786

Je suppose qu' (Index1, Index2) est une clé unique sur Table, sinon j'attendrais la référence à l' t.SpecialEventCount d'entraîner une erreur.

De requête modifié pour utiliser une sous-requête comme il n'a pas de travail à l'aide de 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

6voto

zvibo Points 1

Faire un left join avec une sous-requête génère un géant table temporaire en mémoire qui n'ont pas d'index.

Pour les mises à jour, essayez d'éviter les rejoint et l'aide de corrélation les sous-requêtes à la place:

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

Faire certains profils, mais cela peut être beaucoup plus rapide dans certains cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X