Mysql 从数据库获取交叉记录

Mysql 从数据库获取交叉记录,mysql,Mysql,我有以下表格结构(简化): 如您所见,所有结构都包含许多结构哈希。我想要获取的是每个结构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 struc

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

如您所见,所有结构都包含许多结构哈希。我想要获取的是每个结构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条记录和一些其他列,因此对于每个结构id,查询执行时间都非常长(>15min)

此外,我还手动输入了类型structure_id,而我希望将它们全部输入,就像我在本文顶部给出的示例一样


如何解决此问题?

您可以通过自加入和分组来实现这一点

下面是实现这一点的方法:

select  
t1.structure_id ,
count(t1.structure_id ) as count

from  structure  t1 
inner join structure  t2 on t1.structure_id !=t2.structure_id  
and t1.structure_hash_id=t2.structure_hash_id
group by t1.structure_id 
SQL Fiddle示例:

select  
t1.structure_id ,
count(t1.structure_id ) as count

from  structure  t1 
inner join structure  t2 on t1.structure_id !=t2.structure_id  
and t1.structure_hash_id=t2.structure_hash_id
group by t1.structure_id