带有左连接和分组依赖的MySQL Update查询

时间:2010-06-11 11:45:43

标签: mysql group-by

我正在尝试创建更新查询,并且在获取正确的语法方面进展甚微。 以下查询正在运行:

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

它会创建三元组列表Index1,Index2,EventCounts。 它仅在t.SpecialEventCount为NULL的情况下执行此操作。我试图写的更新查询应该将此SpecialEventCount设置为该计数,即上面查询中的COUNT(m.EventType)。此数字可以是0或任何正数(因此左连接)。 Index1和Index2在表t中是唯一的,它们用于识别MEvent中的事件。

如何修改select查询以成为更新查询?即

之类的东西
UPDATE Table SET SpecialEventCount=COUNT(m.EventType).....

但我感到困惑的是放在哪里,并且失败了许多不同的猜测。

3 个答案:

答案 0 :(得分:79)

我认为(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 :(得分: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

进行一些分析,但在某些情况下这可能会明显加快。

答案 2 :(得分:1)

我的例子

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;