【问题标题】:How to join and get data with multiple table but the same structure?如何连接和获取具有多个表但结构相同的数据?
【发布时间】:2013-08-28 11:46:26
【问题描述】:

连接多个表,一行获取数据。

tbl_2012-08(结构)

编号 |数据日志 |数据名称
1 | 0001 |第一的 2 | 0002 |第二


tbl_2012-09(结构)

编号 |数据日志 |数据名称
1 | 0003 |第三


输出:

数据日志 0001 0002 0003

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

【问题讨论】:

  • UNIONUNION ALL?

标签: mysql sql


【解决方案1】:

我不知道您为什么每个月都有单独的表,但您应该能够使用 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`

【讨论】:

  • 我将这个表分开,因为它是一个日志。并且每个月都有大量的数据。
  • @user2324375 问题是当你到了 5 年时,你将有大量的表格需要管理。表能够存储大量数据,创建额外的表是 IMO 的坏习惯。
  • 那你有什么建议?只创建一张表并获得数十亿的数据?
  • @user2324375 我不打算争论数据库设计的来龙去脉,但您为每个月创建单独的表的路线是不好的做法。在您的情况下,如果您需要返回一整年的数据,您将不得不 UNION 12 个表,而不仅仅是使用带日期的 WHERE 过滤器。
  • @user2324375 当然可以。当正确索引并使用正确的查询时,数据库可以非常有效地处理大量数据。每个月创建一个额外的表将很难管理(新表 = 需要更新查询)。从长远来看,固定数量的表格将更容易处理。如果您只积极使用过去 X 个月的数据,您始终可以选择“ArchivedLog”表和“Log”表。
【解决方案2】:

你应该使用 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 语句必须返回相同数量的列。

【讨论】:

    【解决方案3】:

    您应该使用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>
    

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2015-02-20
      • 1970-01-01
      • 2010-09-29
      • 2023-03-15
      • 1970-01-01
      • 2022-06-10
      • 2017-07-12
      • 1970-01-01
      相关资源
      最近更新 更多