2011-03-22 45 views
1

我對兩個表執行MySQL查詢MySQL的SUM(查詢工作,但返回意想不到的結果)

keyword_stats

+-------------+---------------+------+-----+-------------------+----------------+ 
| Field  | Type   | Null | Key | Default   | Extra   | 
+-------------+---------------+------+-----+-------------------+----------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment | 
| keywordid | int(11)  | NO | MUL | NULL    |    | 
| campaignid | int(11)  | NO |  | NULL    |    | 
| clicks  | int(11)  | NO | MUL | NULL    |    | 
| impressions | int(11)  | NO | MUL | NULL    |    | 
| cost  | decimal(10,2) | NO | MUL | NULL    |    | 
| conversions | int(11)  | NO | MUL | NULL    |    | 
| timestamp | timestamp  | NO | MUL | CURRENT_TIMESTAMP |    | 
| statsdate | date   | NO | MUL | NULL    |    | 
+-------------+---------------+------+-----+-------------------+----------------+ 

關鍵詞表

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| clientid | int(11)  | NO | MUL | NULL |    | 
| campaignid | int(11)  | NO |  | NULL |    | 
| keywordid | int(11)  | NO | MUL | NULL |    | 
| text  | varchar(125) | NO | MUL | NULL |    | 
| status  | varchar(10) | NO | MUL | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 

隨着以下SQL查詢

SELECT 
    k.status, statsdate, 
    SUM(impressions) AS impressions, SUM(clicks) AS clicks, 
    SUM(conversions) AS conversions, SUM(cost) AS cost 
    FROM keyword_stats 
     LEFT JOIN 
      (
       SELECT 
        text,keywordid,status 
       FROM keywords 
      ) AS k USING (keywordid) 
    WHERE 
     campaignid = 56486451 
     AND statsdate BETWEEN '2011-03-01' AND '2011-03-23' 
     AND k.status = "enabled" 
    GROUP BY keywordid 
    ORDER BY conversions DESC, clicks DESC, impressions DESC LIMIT 0, 10 

隨着

+---------+------------+-------------+--------+-------------+-----------+ 
| status | statsdate | impressions | clicks | conversions | cost  | 
+---------+------------+-------------+--------+-------------+-----------+ 
| enabled | 2011-03-01 | 71256166 | 242079 |  4247 | 891572.71 | 
| enabled | 2011-03-01 |  1101 |  10 |   1 |  43.19 | 
| enabled | 2011-03-01 |   210 |  6 |   0 |  23.40 | 
| enabled | 2011-03-01 |   331 |  4 |   0 |  15.29 | 
| enabled | 2011-03-01 |   672 |  3 |   0 |  11.41 | 
| enabled | 2011-03-01 |   486 |  2 |   0 |  8.93 | 
| enabled | 2011-03-01 |   254 |  2 |   0 |  9.48 | 
| enabled | 2011-03-01 |  2201 |  1 |   0 |  2.96 | 
| enabled | 2011-03-01 |   581 |  1 |   0 |  3.25 | 
| enabled | 2011-03-01 |   483 |  1 |   0 |  4.39 | 
+---------+------------+-------------+--------+-------------+-----------+ 
10 rows in set (12.12 sec) 

查詢運行的結果,並執行符合預期,除非你可能會看到的第一個結果包含了意想不到的結果,因爲這是不可能的任何關鍵字來獲得點擊的量,轉換或成本總和我試圖找出其中MySQL是合併總計實現這一結果

編輯ADDED KEYWORDID

+------------+---------+------------+-------------+--------+-------------+-----------+ 
| keywordid | status | statsdate | impressions | clicks | conversions | cost  | 
+------------+---------+------------+-------------+--------+-------------+-----------+ 
| 2147483647 | enabled | 2011-03-01 | 71256166 | 242079 |  4247 | 891572.71 | 
| 101936939 | enabled | 2011-03-01 |  1101 |  10 |   1 |  43.19 | 
| 23039553 | enabled | 2011-03-01 |   210 |  6 |   0 |  23.40 | 
| 117364874 | enabled | 2011-03-01 |   331 |  4 |   0 |  15.29 | 
| 18862051 | enabled | 2011-03-01 |   672 |  3 |   0 |  11.41 | 
| 16695651 | enabled | 2011-03-01 |   486 |  2 |   0 |  8.93 | 
| 14690232 | enabled | 2011-03-01 |   254 |  2 |   0 |  9.48 | 
| 18046691 | enabled | 2011-03-01 |  2201 |  1 |   0 |  2.96 | 
| 22232901 | enabled | 2011-03-01 |   581 |  1 |   0 |  3.25 | 
| 15072731 | enabled | 2011-03-01 |   483 |  1 |   0 |  4.39 | 
+------------+---------+------------+-------------+--------+-------------+-----------+ 
10 rows in set (11.99 sec) 
+0

可以通過你把它添加關鍵字字段和組呢?我想看看總和之間有什麼不同...... – BigFatBaby 2011-03-22 15:06:28

+0

它或者「有效」(按預期執行)或者它沒有。這是什麼? – 2011-03-22 15:08:24

回答

1

keywordid是兩個表中的PRIMARY KEY

最可能的是,你在兩個表導致交叉聯接這個keywordid在有很多的記錄keywordid

還要注意的是,首先,LEFT JOIN是多餘的查詢,因爲你是在k.status過濾,第二,MySQL不優化內聯的意見好。

只要使用此:

SELECT k.status, statsdate, 
     SUM(impressions) AS impressions, SUM(clicks) AS clicks, 
     SUM(conversions) AS conversions, SUM(cost) AS cost 
FROM keyword_stats 
JOIN keywords 
USING (keywordid) 
WHERE campaignid = 56486451 
     AND statsdate BETWEEN '2011-03-01' AND '2011-03-23' 
     AND k.status = "enabled" 
GROUP BY 
     keywordid 
ORDER BY 
     conversions DESC, clicks DESC, impressions DESC 
LIMIT 0, 10 
+0

keywordID在關鍵字中的兩個表(8,000)記錄中都是普遍存在的,在keyword_stats表中存在30,000個記錄。 – Nick 2011-03-22 15:19:28

+0

@nwhiting:我是否明白你的意思:你有'關鍵字'中的8k個記錄和'keyword_stats'中的30k個記錄共享相同的'keywordid'值? – Quassnoi 2011-03-22 15:21:08

+0

@quassnoi是的'keyword'表中有8k個關鍵字記錄,'keyword_stats'表中有'30k'記錄,它們有相應的'keywordid'。 – Nick 2011-03-22 15:27:06

0

你需要每一天的信息?或者你是否需要所有日子的數據總和?

如果您希望每天的數據通過表達式在組中添加「statsdate」。

然後,我thik,你不需要做一個子查詢。你可以把表名稱放在左連接中。

如果您希望每個「keywordid」的數據都在結果字段中輸入「keywordid」。因爲一直被「激活」狀態不是強制性

例子:

SELECT 
    keywordid, statsdate, 
    SUM(impressions) AS impressions, SUM(clicks) AS clicks, 
    SUM(conversions) AS conversions, SUM(cost) AS cost 
    FROM keyword_stats 
    LEFT JOIN keywords k USING (keywordid) 
    WHERE 
     campaignid = 56486451 
     AND statsdate BETWEEN '2011-03-01' AND '2011-03-23' 
     AND k.status = "enabled" 
    GROUP BY keywordid, statsdate 
    ORDER BY conversions DESC, clicks DESC, impressions DESC LIMIT 0, 10