【问题标题】:mysql getting result from two identical tablemysql从两个相同的表中获取结果
【发布时间】:2014-02-14 11:09:41
【问题描述】:

我有两张相同的桌子。我想比较这两个表并从中获取结果。条件是:

  1. TABLE1 中按 TID 分组的每条记录将与 TABLE2 中按其每个 TID 分组的所有记录进行比较。

  2. 如果要在 TABLE2 中发现 TABLE1 中的每个 分组 记录(TABLE2 中也按每个 tid 分组的记录),则多达 N(N 是用户输入变量) ,然后该记录将被插入到新表中。

例如像下面的ss,ITEM C-F-ATID 2分组在table2中出现了3次,因此它们将被插入到新表中:

我已经尝试为此编写代码并且它可以工作(vb.net),但是编译器需要很长时间才能完成。主要原因是我正在处理一个庞大的数据库。

我在程序中完成的方法是将两个表填充到二维数组中。在将两个元素与if clause 进行比较时为数组赋值。

下面是我创建的二维数组:

但是这种方法真的很贵,我上面图片上的真实数据库是第一个二维数组有 2k 条记录,第二个二维数组有 800 条记录,当我尝试计算编译到的估计时间时完成后,它显示了一个惊人的数字,大约 16 小时.. 天哪!!

所以我想知道,这个问题是否可以用mysql查询来解决, 或其他比我做的更有效的方法?

【问题讨论】:

  • 您到底想达到什么目的?你只是想镜像表格吗?这些是在同一个数据库中还是在不同的数据库中?
  • 它在同一个数据库中.. 两个具有相同字段的相同表。我想要实现的是在 TABLE1 中选择 以 TID 作为标识符的记录分组,这在 TABLE2 中有一定的出现次数。简而言之,TABLE1 中按 TID 分组的每条记录都会检查它们在 TABLE2 中的频率。如果达到一定数量的频率,则将 TABLE1 中的分组记录插入到新表中
  • @GrandmasterB 他想做一个合并操作,但我不知道 MySQL,所以我不能说天气它有这样的功能或如何完成。此外,他还想基于复杂的聚合进行合并操作,这使得它更不可能成为集合操作,这可能必须相对强制地使用插页式表格来完成
  • 啊,我明白了。所以基本上,对于表 1 中的每个组 id,如果表 2 中存在相同组 id 高于某个指定计数的行,则将这些行添加到表 1。实际应用程序可能正在等待车辆装满足够的乘客或包裹,然后再发送。

标签: mysql performance compare


【解决方案1】:
INSERT INTO tbl3 
  SELECT tbl1.TID, tbl1.ITEM 
  FROM tbl1 
    JOIN tbl2 ON tbl2.TID = tbl1.TID AND tbl2.ITEM = tbl1.ITEM

这将为 tbl1 中的每条记录插入一条记录到 tbl3,这些记录在 tbl2 中具有由 TID 和 ITEM 标识的相应记录。

这假定 TID/ITEM 是 tbl1 和 tbl2 中的唯一索引。

【讨论】:

  • 嗨@Rob,谢谢回答.. 不幸的是,TID 和 ITEM 在此处充当没有 PK 或 FK 关系的正常字段。并且插入条件不仅是 TABLE1.grouped_records*& 确实存在于 **TABLE2.grouped_records.. 而且还需要两个表之间的一定数量的匹配,因此它将是一个有效的条件插入新表
【解决方案2】:

好的,这是一个未经测试的狂野猜测 (WUG)。

方法是这样的:

  • 您需要 table1 中的 TID 列表。因此,您构建了一个不同的列表(最内部的查询)。
  • 从 table2 中选择时,您在 where 子句中使用该列表,这样您只能获得 table1 中具有 TID 的行。您对该查询进行分组,然后使用 HAVING 将行限制为仅计数 > X 的行。
  • 现在您有一个 TID 列表,该列表与 table1 中的 TID 匹配,并且在 table2 中有超过 X 个条目。您选择这些行。
  • 这些用作向 table1 中插入语句的来源。

SQL 可能类似于:

    insert into table1 
      values (select * from table2 where tid in 
        (select tid, count(*) as cnt 
            from table2 
            where tid in (select distinct tid from table1) 
            group by tid
            having cnt > 10)));

我怀疑语法是否正确(不记得从选择中插入的确切语法),并且没有声称它会立即起作用,但如果我想在其中完成所有操作,我的第一枪会是什么一个查询。

【讨论】:

  • 嗨@GrandmasterB 是WHERE IN CLAUSE 是指从table2 中选择仅与table1 中的GROUPED ITEM BY TID 匹配的GROUPED ITEM BY TID?那么您的查询不会只选择匹配的tid计数而不是匹配的tid元素吗?我的意思是,如果 TABLE1 的 TID 2 有 3 个计数,那么它也会在 TABLE2 中搜索匹配的 TID with 3 count 吗?我的意思是 TABLE1 TID2 得到了 C-F-A,因此它将在 TABLE2 中搜索包含 C-F-A 的 TID。并且查询在WHERE IN 仍然有错误,我尝试使用ALIAS 修复它,但它也没有工作。谢谢你
  • 它将从 table2 中选择所有行,他们的 tid 也在 table1 中找到。您可能会考虑的另一件事是设置一些视图,使 sql 更直接。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多