Mysql 从数据库获取交叉记录
我有以下表格结构(简化): 如您所见,所有结构都包含许多结构哈希。我想要获取的是每个结构id的信息,即它包含的结构哈希在其他结构中的数量。因此,对于这个例子,它应该是: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
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