0

我试图达到的目标;

计算两个表中的行数(将它们加在一起),Country按表中列中的国家代码对它们进行分组。然后我将按行数和国家/地区输出结果,例如

  • GB => 200 次观看
  • 美国 => 500 次观看
  • CH => 119 次观看

我到目前为止的 MySQL 代码;

SELECT COUNT(id) as TotalClicks, Country FROM adverts_analytics_user_clicks WHERE AdvertID =:AdvertID GROUP BY Country

这很好用,但是我需要它同时从另一个表中选择相同的数据并COUNT()根据Country字段组合值。

任何帮助,将不胜感激!

4

2 回答 2

0

一种方法是使用 UNION ALL 运算符将另一个查询附加到您的查询中。(该查询可以引用不同的表名;重要的是它返回具有相同数据类型的相同数量的列。)然后将其包装在一组括号中,并为其分配一个别名,然后使用它代替外部查询中的表名:

例如:

SELECT SUM(t.TotalClicks) AS TotalClicks, t.Country
  FROM (
         /* original query*/

         SELECT COUNT(id) as TotalClicks, Country
           FROM adverts_analytics_user_clicks
          WHERE AdvertID =:AdvertID
          GROUP BY Country

          /* append results from query that returns same columns */
          UNION ALL
          SELECT COUNT(id) as TotalClicks, Country
            FROM some_other_table
           WHERE AdvertID =:AdvertID2
           GROUP BY Country
      ) t
  GROUP BY t.Country

注意:当同一个绑定变量名在同一个语句中使用两次时,我们遇到了问题。我们使用了单独的绑定变量名称,并绑定了两次相同的值。

由于 MySQL 处理内联视图的方式(将其具体化为临时表),从每个表中获取聚合然后将聚合连接在一起几乎总是比连接非聚合表更有效。


跟进

simon funiic 说...... 该语句正在运行,但是它没有为 TotalClicks 返回正确的数字(Country GB 有两行 - 每个表中有一个),但只返回 1。

回复

给定外部查询上的 GROUP BY(在我上面的回答中),我们期望 Country 值为'GB'. 如果您只在内联视图中运行查询(如t上面查询中的别名),您将获得两行。

最外面的查询是组合这两行(使用 GROUP BY t.Country),并将 TotalClicks 中的值加在一起(SUM(t.TotalClicks)

如果您希望单独返回行,则根本不需要该外部查询。

如果您想在每一行上包含一个“标签”来标识该行来自哪个查询,可以很容易地在每个查询的 SELECT 列表中添加一个文字:

     SELECT COUNT(id) AS TotalClicks
          , Country
          , 'aauc' AS `source`
       FROM adverts_analytics_user_clicks
      WHERE AdvertID =:AdvertID
      GROUP BY Country
      UNION ALL
     SELECT COUNT(id) AS TotalClicks
          , Country
          , 'sot' AS `source`
       FROM some_other_table
      WHERE AdvertID =:AdvertID2
      GROUP BY Country
      ORDER BY 2,3
于 2013-07-29T20:23:41.737 回答
0

对第二个表重复第一个查询,以使输出列具有相同的名称和数据类型。

然后将这些结果合并在一起。

最后按国家/地区汇总总点击次数。

SELECT Country, sum(TotalClicks) as TotalClicks
FROM 
(
SELECT COUNT(id) as TotalClicks, Country FROM adverts_analytics_user_clicks WHERE AdvertID =:AdvertID GROUP BY Country
UNION ALL
SELECT COUNT(id) as TotalClicks, Country FROM table 2 WHERE AdvertID =:AdvertID GROUP BY Country
)
GROUP BY Country
于 2013-07-29T20:21:08.890 回答