簡體   English   中英

帶有左連接和分組依賴的MySQL Update查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM