mysql从两个相同的表中获取结果

时间:2014-01-23 18:05:26

标签: mysql performance compare

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

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

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

  3. 例如,与下面的ss一样,按 TID 2 分组的 ITEM C-F-A 在table2中有3次出现,因此它们将被插入到新表中:

    enter image description here

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

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

    下面是我创建的2d数组:

    enter image description here

    但是这种方法真的很贵,我上面的真实数据库是第一个2d阵列有2k记录而第二个2d阵列有800个记录,当我尝试计算编译的估计时间时完成了,它显示了一个梦幻般的数字,大约16个小时..天啊!

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

2 个答案:

答案 0 :(得分:0)

INSERT INTO tbl3 
  SELECT tbl1.TID, tbl1.ITEM 
  FROM tbl1 
    JOIN tbl2 ON tbl2.TID = tbl1.TID AND tbl2.ITEM = tbl1.ITEM

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

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

答案 1 :(得分:0)

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

方法如下:

  • 您需要table1中的TID列表。因此,您构建一个不同的列表(最内层的查询)。
  • 从table2中选择时,在where子句中使用该列表,以便只获取table1中具有TID的行。您对该查询进行分组,然后使用HAVING将行限制为仅包含计数>的行。 X
  • 现在您有一个与table1中的TID相匹配的TID列表,并且在table2中有超过X个条目。你选择那些行。
  • 这些用作insert1语句的源代码。

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)));

我怀疑语法是否正确(无法记住选择插入的确切语法),并且没有声称它可以起作用,但它是我的第一次拍摄,如果我想要全部在一个查询。