2014-03-27 46 views
1

我有一個很大的查詢,我試圖優化。MySQL更新基於單箇中頻的多個列

這是一個INSERT INTO ... ON DUPLICATE KEY UPDATE。 但是,我只需要在特定條件下更新該行。因爲我知道你不能使用WHEREON DUPLICATE KEY UPDATE,所以我使用的是IF

但我需要根據完全相同的條件更新兩列。問題在於條件很長。這是column1 IN(大規模加入選擇)。有兩次這似乎並不正確。我會創建一個臨時表,但由於這只是在UPDATE部分而不是INSERT之一中需要的,所以在某些情況下這會產生不必要的工作。

我的問題是:

我怎麼能基於在ON 重複鍵UPDATE單一條件更新多列。

回答

0

update語句可以參考價值insert . . . selectfrom子句。這個想法是把你的查詢,並使其成爲一個子查詢。然後再添加一列,這是您的計算列。您可以在set子句中使用這樣的:

insert into table(col1, . . .) 
    select . . . 
    from (select cols, . . ., 
        col1 in (complicated stuff here) as IsPresent 
      from . . . 
     ) t 
    on duplicate key update colx = if(t.IsPresent, a, b), coly(if.tIsPresent, d, e); 

當然,你可以擺脫子查詢(它有自己的開銷),但是這是從你的描述最通用的方法。

+0

謝謝,我沒有想到這種方法! – olinhart

0

根據this文檔,你可以更新多個列

INSERT INTO table (a,b,c) VALUES (1,2,3) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3 
+0

不完全是我正在尋找 - 我需要根據一個共同的條件來更新它們。標記爲正確的解決方案是我正在尋找的解決方案。無論如何感謝... – olinhart