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
Elle 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.
Vous devez vous connecter pour publier un commentaire.
- Je considérer que
(Index1, Index2)
est une clé unique surTable
, sinon j'attendrais la référence àt.SpecialEventCount
à provoquer une erreur.De requête modifié pour utiliser une sous-requête comme il n'a pas de travail à l'aide de
GROUP BY
SET t.SpecialEventCount = m.NumEvents
àSET t.SpecialEventCount = IFNULL(m.NumEvents, 0)
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:
Faire certains profils, mais cela peut être beaucoup plus rapide dans certains cas.
mon exemple