如何组合不同表的SUM值? (很好的表现?)

时间:2012-04-10 11:47:54

标签: mysql performance sum

我有以下表结构,有很多这样的表:

data_1:
+-------+--------+-------+
| views | clicks | date  |
+-------+--------+-------+
|    29 |     1  | ..... |
|   458 |     9  | ..... |
+-------+--------+-------+ 
....

data_43:
+-------+--------+-------+
| views | clicks | date  |
+-------+--------+-------+
|     0 |     0  | ..... |
|     0 |     0  | ..... |
+-------+--------+-------+ 
...

我的问题是,如何在一个查询中获取所有和值?

我尝试了一个简单的连接:

mysql> SELECT SUM(t1.views)  data_1_views,
              SUM(t1.clicks) data_1_clicks,
              SUM(t2.views)  data_43_views,
              SUM(t2.clicks) data_43_clicks
       FROM data_1 t1, data_43 t2;

但我的结果不符合我的预期:

+--------------+---------------+---------------+----------------+
| data_1_views | data_1_clicks | data_43_views | data_43_clicks |
+--------------+---------------+---------------+----------------+
|         NULL |          NULL |          NULL |           NULL |
+--------------+---------------+---------------+----------------+

我原以为:

+--------------+---------------+---------------+----------------+
| data_1_views | data_1_clicks | data_43_views | data_43_clicks |
+--------------+---------------+---------------+----------------+
|         487  |          10   |             0 |              0 |
+--------------+---------------+---------------+----------------+

此处有人可以帮我解决此疑问吗? 如果这比在多个查询中执行所有这些操作更有效,我也感兴趣

2 个答案:

答案 0 :(得分:1)

使用Union查询。

如下所示:

SELECT sum(t.data_1_views) as data_1_views,SUM(t.data_1_clicks) as data_1_clicks,
SUM(t.data_43_views) as data_43_views,SUM(t.data_43_views) as data_43_views
    FROM (
        SELECT SUM(t1.views)  data_1_views,SUM(t1.clicks) data_1_clicks,
        0 as data_43_views,0  as data_43_clicks
        FROM FROM data_1 as t1

        UNION

        SELECT 0 as data_1_views,0  as data_1_clicks,SUM(t1.clicks) as data_43_views, SUM(t2.clicks) 
        FROM data_43_clicks as t2 
       ) as t GROUP BY 1

答案 1 :(得分:1)

在这种情况下,多个查询很好,特别是如果要对很多行进行分组。实际上没有任何好处(实际上是潜在的错误)将这两个表集中在一个查询中。 我只想进行两次查询

SELECT SUM(t1.views) data_1_views, SUM(t1.clicks) data_1_clicks
FROM data_1 t1 

SELECT SUM(t2.views) data_43_views, SUM(t2.clicks) data_43_clicks
FROM data_43 t2;