我需要从包含相似结构数据的两个表中选择匹配的对。这里的“匹配对”是指在“匹配”列中相互引用的两行。
单表配对示例:
TABLE
----
id | matchid
1 | 2
2 | 1
ID 1 和 2 是一对匹配的,因为每个都有一个匹配条目。
现在真正的问题是:选择出现在两个表中的匹配对的最佳(最快)方法是什么:
Table ONE (id, matchid)
Table TWO (id, matchid)
示例数据:
ONE TWO
---- ----
id | matchid id | matchid
1 | 2 2 | 3
2 | 3 3 | 2
3 | 2
4 | 5
5 | 4
所需的结果是 ID 为 2 和 3 的单行。
RESULT
----
id | id
2 | 3
这是因为 2 和 3 是表一和表二中的匹配对。4 & 5 是表 ONE 中的匹配对,但不是 TWO,因此我们不选择它们。1 和 2 根本不是匹配对,因为 2 没有与 1 匹配的条目。
我可以从一个表中得到匹配的对:
SELECT a.id, b.id
FROM ONE a JOIN ONE b
ON a.id = b.matchid AND a.matchid = b.id
WHERE a.id < b.id
我应该如何构建一个只选择两个表中出现的匹配对的查询?
我是不是该:
- 为每个表选择上面的查询并将它们一起存在于哪里?
- 为每个表选择上面的查询并将它们连接在一起?
- 选择上面的查询然后 JOIN table TWO 两次,一次用于“id”,一次用于“matchid”?
- 为每个表选择上面的查询并循环以在 php 中比较它们?
- 不知何故过滤表二,所以我们只需要查看表一中匹配对的ID吗?
- 做一些完全不同的事情?
(由于这是一个效率问题,值得注意的是匹配会非常稀疏,可能是 1/1000 或更少,并且每个表将有 100,000+ 行。)