【问题标题】:Comparing two large data sets or tables in mysql比较mysql中的两个大型数据集或表
【发布时间】:2013-09-18 03:14:44
【问题描述】:

假设我有 2 个大型 csv 文件(超过 100 万行),两者都是具有排名的名称列表。目标是在两个列表中找到相同的名称,列表 1 中的唯一名称和列表 2 中的唯一名称。

我想这样做是 mySQL,所以我为每个列表创建了一个表,但是一百万次循环超过一百万条记录似乎是一种糟糕的方式,而且非常慢。你会怎么做呢?

这是一个示例但错误的查询:http://sqlfiddle.com/#!2/9f272/2

【问题讨论】:

  • 所以您想要三个结果: 1.相同/相似的名称 2.) 1 中的唯一 3.) 2 中的唯一?相似是什么意思?
  • 对不起,我的意思是一样不相似。

标签: mysql sql list csv dataset


【解决方案1】:

以下返回名称在每个表中出现的次数以及计数。如果每个表中的名称都是唯一的,那么它可能会返回如下内容:

InTable1   InTable2    Count
1          0           xxx
0          1           yyy
1          1           zzz

查询使用union allgroup by

select InTable1, InTable2, count(*), min(name), max(name)
from (select name, sum(which = 1) as InTable1, sum(which = 2) as InTable2
      from ((select name, 1 as which
             from table1
            ) union all
            (select name, 2 as which
             from table2
            )
           ) t
      group by name
     ) t
group by InTable1, InTable2;

编辑:

您需要创建索引。语法如下:

create index table1_name on table1(name);
create index table2_name on table2(name);

【讨论】:

  • 我不是在寻找计数,名称在每个列表中只出现一次,但有时它们在一个列表中而不是另一个列表中。
  • @DaveLobby 。 . .查询将执行此操作。当我面对这个问题时,我会查看计数。它有助于确保对数据的假设是正确的。
  • 您的建议:sqlfiddle.com/#!2/9f272/1 这就是我想要的,但有更好的查询:sqlfiddle.com/#!2/9f272/2
  • @DaveLobby 。 . .你的查询没问题。只需在table2(name) 上添加一个索引。
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多