从数据库中获取交叉记录

时间:2015-09-15 16:16:28

标签: mysql

我有以下表结构(简化):

id | structure_id | structure_hash_id
1    1              1
2    1              2
3    1              3
4    2              4
5    2              1
6    3              2

如您所见,所有结构都包含许多结构哈希。我想要获取的是每个结构id的信息,它包含多少结构哈希存在于其他结构中。因此,对于这个例子,它是:

structure_id #1: 2
structure_id #2: 1
structure_id #3: 1

我为此写的查询是:

SELECT contains.structure_id, COUNT(contains.structure_hash_id)
FROM (
   SELECT *
   FROM structureTable st
   WHERE structure_id = 1
) AS contains
INNER JOIN (
   SELECT *
   FROM structureTable st
   WHERE structure_id != 1
) AS notcontains
ON contains.structure_hash_id = notcontains.structure_hash_id
GROUP BY contains.structure_id;

它有效,我是从记忆中写的,我不记得我在删除它之前的写作方式,但你明白了。

但问题是在实际表中我有~500mln记录和一些其他列,因此对于每个structure_id,查询执行时间很长(> 15分钟)。

另外,我手动输入了structure_id,而我想把它们全部放在一边,就像我在这篇文章的顶部给出了一个例子。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以通过自我加入和分组来实现这一目标。

以下是这样做的方法:

Converter

SQL小提琴示例:http://sqlfiddle.com/#!9/678bf7/1/0