2012-06-06 8 views
4

select를 사용하여 mysql update query를 실행하려고하는데 오류가 발생합니다. '근처 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 (Impressions_chg, 당신은 당신의 SQL 구문에 오류가 있습니다 - 전용 "# 1064Mysql select with join select with

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) 

그러나 내가 갖는 : 쿼리는 이것이다 라인 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)를 가질 수 없습니다? 이것 좀 도와 줄래.

에서, Clicks_chg, AveragePosition_chg, Ctr_chg, AverageCpc_chg, 문헌 [Curr '

쿼리를 다시 작성하십시오. 다음과 같은 것 :

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를 최적화하십시오. –