我试图实现的目标;
计算两个表中的行数(将它们加在一起)按表中Country
列中的国家/地区代码对它们进行分组。然后,我将按行数和国家/地区输出结果,例如
我到目前为止的MySQL代码;
SELECT COUNT(id) as TotalClicks, Country FROM adverts_analytics_user_clicks WHERE AdvertID =:AdvertID GROUP BY Country
这很有效,但是我需要它同时从另一个表中选择相同的数据,并根据COUNT()
字段合并Country
值。
任何帮助将不胜感激!
答案 0 :(得分:0)
对第二个表重复您的第一个查询,以使输出coumns具有相同的名称和数据类型。
然后将这些结果结合在一起。
最后按国家/地区总计点击次数。
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
答案 1 :(得分:0)
一种方法是使用UNION ALL运算符向查询追加另一个查询。 (该查询可以引用不同的表名;重要的部分是它返回具有相同数据类型的相同数量的列。)然后将其包装在一组parens中,并为其分配别名,然后使用它来代替外部查询中的表名:
例如:
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