繁体   English   中英

MySQL SUM(查询有效,但返回意外结果)

[英]MySQL SUM ( Query works but returns unexpected results )

我在两个表上执行MySQL查询

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的位置合并总计以达到该结果

编辑添加的关键字ID

+------------+---------+------------+-------------+--------+-------------+-----------+
| 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)

keywordid是两个表中的PRIMARY KEY

最有可能的是,您的两个表中都有一个有大量记录的keywordid ,这导致此keywordid上的交叉keywordid

还要注意,首先,由于要对k.status进行过滤, k.status LEFT JOIN在查询中是多余的;其次, 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

您是否需要每天的信息? 还是您需要整天的数据总和?

如果需要每天的数据,请按表达式在组中添加“ statsdate”。

然后,我认为您不需要进行子查询。 您可以在左联接中将表名放在右边。

如果要每个“关键字ID”的数据,请在结果字段中输入“关键字ID”。 状态不是强制性的,因为始终处于“启用”状态

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM