从表

时间:2015-09-16 22:33:42

标签: mysql

我有以下(简化)表:

structure_id | hash_id
1              1
1              2
1              3
2              4
2              5
2              1
3              6
3              1
3              4

我希望得到重复哈希id的交集 - 这意味着以下示例:

- 1 2 3
1 3 1 1
2 1 3 2
3 1 2 3

因为1和1结构ID共享3条记录,1和2共享1条记录,等等.SQL结果将是:

id | intersected_id | count
1    1                3
1    2                1
1    3                1
2    1                1
2    2                3
2    3                2
3    1                1
3    2                2
3    3                3

值得一提的是,该表有大约500mln记录,因此查询必须尽可能优化。我怎么能这样做?

到目前为止我尝试的是自我加入:

SELECT t1.structure_id, COUNT(t1.hash_id) FROM table t1 INNER JOIN table t2 ON t1.structure_id != t2.strucutre_id AND t1.hash_id = t2.hash_id GROUP BY t1.structure_id;

但它没有正常工作 - 它在所有其他结构ID中找到重复的行。

2 个答案:

答案 0 :(得分:2)

您可以使用自我加入来执行此操作:

select t1.structure_id, t2.structure_id, count(*)
from test t1 join
     test t2
     on t1.hash_id = t2.hash_id
group by t1.structure_id, t2.structure_id;

答案 1 :(得分:0)

这样可行,但我怀疑它能够满足您的需求。正如我在评论中所说,也许一个必要的程序会更适合这个问题。

SELECT id 
      ,intersected_id 
      ,COUNT(DISTINCT hash_id) AS `count`
FROM (
  SELECT t1.structure_id AS id 
        ,t2.structure_id AS intersected_id 
        ,t1.hash_id 
  FROM test AS t1
  INNER JOIN test AS t2
  ON t1.hash_id = t2.hash_id
) derived
GROUP BY id, intersected_id

SQL Fiddle