我正在寻找最高性能的方法,以从关系数据库交互表中获取子集列表。
例如该表可跟踪每个组中的哪些项目:
GroupID ItemId
1 1
1 2
1 3
2 1
2 2
3 2
我希望结果是:
Superset Subset
1 2
1 3
2 3
也就是说,第2组是G1和G2的第1组,G3的子集,但是1,2,3的其他组合都不是彼此的子集。
很容易想到下面的循环内循环解决方案。但是,在我的实际表中,有成千上万个群组,因此即使我在下面的代码中省略了一些次要的快捷方式,也不可行。
foreach(Group) {
foreach(Group) {
--Make sure Group#1 > Group#2
SELECT @num:=COUNT(*)
FROM the_table_above
WHERE GroupID = Group#1
AND ItemID NOT IN (
SELECT ItemID FROM the_table_above WHERE GroupID = Group#2
)
if(@num == 0) we have a subset!
}
}
这可以快一个数量级吗?