在php中一次从两个MySQL表中选择数据

时间:2013-07-29 20:17:23

标签: php mysql

我试图实现的目标;

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

  • GB => 200次观看次数
  • US => 500次观看次数
  • CH => 119意见

我到目前为止的MySQL代码;

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

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

任何帮助将不胜感激!

2 个答案:

答案 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