2012-06-06 146 views
4

我想運行mysql更新查詢與選擇,但我得到一個錯誤。查詢是這樣的:與選擇加入Mysql更新查詢

UPDATE keywords_stats_google_temp SET (Impressions_chg, Clicks_chg, AveragePosition_chg, Ctr_chg, AverageCpc_chg, CurrentMaxCpc_chg, FreeJoins_chg, PaidJoins_chg) = (SELECT 
       SUM(Impressions) AS Impressions, 
       SUM(Clicks) AS Clicks, 
       SUM(Impressions*AveragePosition)/SUM(Impressions) AS AveragePosition, 
       (SUM(Clicks)*revenue_price)/SUM(Impressions) AS Ctr, 
       SUM(Spend)/SUM(Clicks) AS AverageCpc, 
       CurrentMaxCpc, 
       SUM(free_joins) AS FreeJoins, 
       SUM(paid_joins) AS PaidJoins 
       FROM (SELECT KeywordId FROM keywords_stats_google_temp) a JOIN keywords_stats_google_naughtymeetings b ON b.KeywordId = a.KeywordId WHERE b.TimePeriod >= '2012-04-01 00:00:00' 
       AND b.TimePeriod <= '2012-04-23 00:00:00' GROUP BY a.KeywordId, MatchType) 

但我發現了唯一的「#1064 - 你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的「正確的語法手冊(Impressions_chg ,Clicks_chg,AveragePosition_chg,Ctr_chg,AverageCpc_chg,CURR」第1" 行

任何人可以幫助我嗎?

謝謝!

+0

你不能在MySQL中有SET(a,b)=(value_a,value_b)'。 –

+0

其實我檢查了一篇文章,有這樣一種方法:http://karlssonondatabases.blogspot.com/2009/01/multicolumn-update-with-subquery-mysql.html – pocko

+0

是的,這是可能的。但不是這個語法。你必須用'UPDATE'的MySQL語法來重寫語句。 –

回答

8

你不能在MySQL SET (a,b) = (value_a, value_b)

重寫查詢。像這樣:

UPDATE 
    keywords_stats_google_temp AS u 
    JOIN 
    (SELECT 
      SUM(Impressions) AS Impressions, 
      SUM(Clicks) AS Clicks, 
      SUM(Impressions*AveragePosition)/SUM(Impressions) AS AveragePosition, 
      (SUM(Clicks)*revenue_price)/SUM(Impressions) AS Ctr, 
      SUM(Spend)/SUM(Clicks) AS AverageCpc, 
      CurrentMaxCpc, 
      SUM(free_joins) AS FreeJoins, 
      SUM(paid_joins) AS PaidJoins 
     FROM keywords_stats_google_naughtymeetings AS b 
     WHERE b.TimePeriod >= '2012-04-01 00:00:00' 
     AND b.TimePeriod <= '2012-04-23 00:00:00' 
     GROUP BY KeywordId, 
       MatchType 
    ) AS tmp 
     ON tmp.KeywordId = u.KeywordId 
     AND tmp.MatchType = u.MatchType 
SET 
    u.Impressions_chg  = tmp.Impressions, 
    u.Clicks_chg   = tmp.Clicks, 
    u.AveragePosition_chg = tmp.AveragePosition, 
    u.Ctr_chg    = tmp.Ctr, 
    u.AverageCpc_chg  = tmp.AverageCpc, 
    u.CurrentMaxCpc_chg = tmp.CurrentMaxCpc, 
    u.FreeJoins_chg  = tmp.FreeJoins, 
    u.PaidJoins_chg  = tmp.PaidJoins ; 
+0

我運行了這個查詢,它看起來像是在工作,但它非常慢。可能應該有人去優化這個...... – pocko

+0

'(KeywordId,MatchType)'上的複合索引將會對'u'有幫助。不確定其他。 –

+0

首先測試子查詢(用「GROUP BY」)計算應計算的內容。確定後,然後嘗試優化UPDATE。 –