[英]MySQL Update query with left join and 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中的事件。
如何修改選擇查詢以成為更新查詢? 就是這樣的
UPDATE Table SET SpecialEventCount=COUNT(m.EventType).....
但我很困惑什么放在哪里,並失敗了許多不同的猜測。
我認為(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
使用子查詢執行左連接將在內存中生成一個沒有索引的巨型臨時表。
對於更新,請嘗試避免連接並使用相關子查詢:
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
做一些分析,但在某些情況下這可能會明顯加快。
我的例子
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.