加入多个表并在一行中获取数据。
tbl_2012-08(结构)
编号 | 数据日志 | 数据名称
1 | 0001 | 第一的 2 | 0002 | 第二
tbl_2012-09(结构)
编号 | 数据日志 | 数据名称
1 | 0003 | 第三
输出:
数据日志 0001 0002 0003
我怎样才能加入这 2 个表,以便我可以一次提取数据。
任何情况都会有所帮助
:
创建另一个表或其他东西
我不知道为什么您每个月都有单独的表,但您应该能够使用UNION
查询从两个表中返回数据:
select id, data_log, data_name
from `tbl_2012-08`
union all
select id, data_log, data_name
from `tbl_2012-09`
我使用 aUNION 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`
你应该使用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 语句必须返回相同数量的列。
你应该使用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>