如何连接和获取具有多个表但具有相同结构的数据?

时间:2013-08-28 11:46:27

标签: mysql sql

加入多个表并将数据放在一行中。

tbl_2012-08(结构)

id | data_log | data_name 
1 | 0001 | first 2 | 0002 | second


tbl_2012-09(结构)

id | data_log | data_name 
1 | 0003 | third


输出:

data_log
0001
0002
0003

我如何加入这个2表,以便我可以一次提取数据 任何情况下都会有所帮助 喜欢:
创建另一个表格或其他东西

3 个答案:

答案 0 :(得分:5)

我不知道为什么每个月都有单独的表,但您应该能够使用UNION查询从两个表中返回数据:

select id, data_log, data_name
from `tbl_2012-08`
union all
select id, data_log, data_name
from `tbl_2012-09`

我使用UNION ALL返回两个表中包含重复项(如果有)的所有行。你不能JOIN表,除非你在两个表中都有一些共同的值,如果你每个月都有单独的表,那么我猜你在两个表中都没有共同的值。

作为旁注,我可能会包含一个列,以便您可以轻松识别数据来自哪个表:

select id, data_log, data_name, '2012-08' mth
from `tbl_2012-08`
union all
select id, data_log, data_name, '2012-09' mth
from `tbl_2012-09`

我的建议是改变这种数据结构,每个月都有一个单独的表格,管理起来非常麻烦。

如果您只想返回data_log,那么您只需使用:

select data_log
from `tbl_2012-08`
union all
select data_log
from `tbl_2012-09`

答案 1 :(得分:0)

您应该使用 UNION ALL

SELECT id, data_log, data_name
FROM `tbl_2012-08`
UNION ALL
SELECT id, data_log, data_name
FROM`tbl_2012-09`

在这种情况下,Union将把一个select语句的结果与另一个select语句连接成一个表。重要的是要注意两个select语句必须返回相同数量的列。

答案 2 :(得分:0)

您应该使用union all。但是,您还应该包含一个标识数据来源的列。在这种情况下,我假设它是日期:

SELECT '2012-08' as YYYYMM, id, data_log, data_name
FROM `tbl_2012-08`
UNION ALL
SELECT '2012-09' as YYYYMM, id, data_log, data_name
FROM`tbl_2012-09`;

此外,如果您希望id在将它们组合在一起后是唯一的,那么这将有效:

select YYYYMM, (@rn := @rn + 1) as id, id as old_id, data_log, data_name
from ((SELECT '2012-08' as YYYYMM, id, data_log, data_name
       FROM `tbl_2012-08`
      ) UNION ALL
      (SELECT '2012-09' as YYYYMM, id, data_log, data_name
       FROM`tbl_2012-09`
      )
     ) t cross join
     (select @rn := 0) const;

您还可以通过执行以下操作创建另一个表:

create table new_table as
    <either of the queries above>