3

次のことを行うクエリに問題があります。

  1. 特定のレコードを取得し、特定の期間の値の一部を計算します
  2. 別の期間について、これらのキーワードの同じ値を計算します

これは 1 つのクエリで発生するはずです。私はそれを書くことができましたが、SUM() は通常よりもはるかに高い間違った値を返します。これはLEFT JOINのせいだと思います。

SELECT SQL_CALC_FOUND_ROWS table1.id, table1.KeywordId, table1.AccountName, table1.CampaignName, table1.AdGroupName, table1.Keyword, table1.MatchType, SUM(table1.Spend)/SUM(table1.Clicks) AS AverageCpc, SUM(table1.Impressions) AS Impressions, (SUM(table1.Clicks)*table1.revenue_price)/SUM(table1.Impressions) AS Ctr, SUM(table1.Impressions*table1.AveragePosition)/SUM(table1.Impressions) AS AveragePosition, SUM(table1.Clicks) AS Clicks, SUM(table1.Spend) AS Spend, SUM(table1.free_joins) AS FreeJoins, SUM(table1.paid_joins) AS PaidJoins, SUM(table1.paid_joins)*table1.revenue_price AS Revenue, (SUM(table1.paid_joins)*table1.revenue_price)-SUM(table1.Spend) AS Profit, (SUM(table1.paid_joins)*table1.revenue_price)/SUM(table1.Clicks) AS RevPerClick, table1.CurrentMaxCpc, SUM(table2.Impressions) AS Impressions_chg, SUM(table2.Clicks) AS Clicks_chg, SUM(table2.Impressions*table2.AveragePosition)/SUM(table2.Impressions) AS AveragePosition_chg, (SUM(table2.Clicks)*table2.revenue_price)/SUM(table2.Impressions) AS Ctr_chg, SUM(table2.Spend)/SUM(table2.Clicks) AS AverageCpc_chg, table2.CurrentMaxCpc as CurrentMaxCpc_chg, SUM(table2.free_joins) AS FreeJoins_chg, SUM(table2.paid_joins) AS PaidJoins_chg
            FROM keywords_stats_google_naughtymeetings as table1
            LEFT JOIN keywords_stats_google_naughtymeetings as table2
            ON table1.keywordId = table2.keywordId
            WHERE table1.timeperiod >= '2012-05-21 00:00:00' and table1.timeperiod <= '2012-05-27 00:00:00'
            AND table2.timeperiod >= '2012-05-14' and table2.timeperiod <= '2012-05-20'

            GROUP BY table1.KeywordId, table1.MatchType, table1.revenue_price, table2.KeywordId, table2.MatchType, table2.revenue_price
            ORDER BY  FreeJoins
                    asc
            LIMIT 0, 10

SUM の正しい結果を得る方法を教えてください。

4

1 に答える 1

0

ここが必要だと思いますINNER JOIN。を に置き換えてみてLEFT JOINくださいINNER JOIN

PS私はあなたが望むものを正確には得られませんが、このアイデアはもっと単純であるべきだと思います.

(SELECT id, fields_for_first_period_of_time
  FROM keywords_stats_google_naughtymeetings) t1
  JOIN
(SELECT id, fields_for_second_period_of_time
  FROM keywords_stats_google_naughtymeetings) t2
ON t1.id = t2.id

これは単なるアイデアのスケッチです。つまり、2 つの別々のクエリで結果を取得します。そして、それらに参加します。これにより、デバッグが容易になります。これがお役に立てば幸いです。

于 2012-06-06T11:55:35.230 に答える