一种方法是使用 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