从两个表的联合中选择

时间:2017-05-11 08:21:17

标签: mysql

我有两个表Cars2016Cars2015,它们具有完全相同的列。

我想简单地连接这两个表来创建这种查询:

SELECT Mark, COUNT(Models) FROM (Cars2015 UNION Cars2016) GROUP BY Mark

此查询旨在了解每个商标有多少型号,累计2015年和2016年。

我怎样才能有效

谢谢!

3 个答案:

答案 0 :(得分:2)

可能最有效的方法是计算每个表,然后将它们联合起来并加以总结。

SELECT Mark, SUM(count) AS count
FROM (
    SELECT Mark, COUNT(*) AS count
    FROM Cars2015
    GROUP BY Mark
    UNION ALL
    SELECT Mark, COUNT(*) AS count
    FROM Cars2016
    GROUP BY Mark
) AS u
GROUP BY Mark

如果表中有Mark的索引,则子查询应该非常有效。然后它正在组合包含聚合的相对较小的中间表,然后将它们组合起来。

另一种选择是使用MERGE storage engine,它允许您创建包含其他表的并集的虚拟表:

CREATE TABLE Cars (
    -- column names here
) ENGINE=MERGE UNION=(Cars2015, Cars2016);

SELECT Mark, COUNT(*)
FROM Cars
GROUP BY Mark;

答案 1 :(得分:1)

UNION运算符用于组合两个或多个SELECT语句的结果集。

  
      
  • UNION中的每个SELECT语句必须具有相同的列数。
  •   
  • 列也必须具有类似的数据类型。
  •   
  • 每个SELECT语句中的列也必须采用相同的顺序。
  •   

试试这个:

SELECT models_count FROM (
    SELECT COUNT(Models) models_count, Mark FROM Cars2015 
    UNION
    SELECT COUNT(Models) models_count, Mark FROM Cars2016
)
GROUP BY Mark

请记住,UNION运算符默认情况下仅选择不同的值。要允许重复值,请使用UNION ALL。

答案 2 :(得分:1)

您需要将from子句中的2个表与子查询结合使用:

select mark, count(*)
from
    (select models, mark from Cars2015
     union all
     select models, mark from Cars2016) t
group by mark

如果您只想获得整体计数(您在选择列表中没有标记字段),那么我会在选择列表中使用2个子库并添加它们:

select (select count(models) from Cars2015) + (select count(models) from Cars2016) as total_models