我在mySQL数据库中有两个表,我想对它们进行连接。想象一下,他们都有3000个条目。当mySQL执行查询时,它将返回3000 * 3000个可能的行。我想在一个表上运行查询,并在第二个表中找到匹配后立即返回每一行(因此,如果它在t2的第二行中找到匹配的行,则可以跳过其他可能的组合)。例如,这将是这样的
从t1中选择*其中至少有一个匹配(t1.id = t2.id)
mySQL有什么方法可以做到这一点吗?
我知道通常应该避免这种连接,但在这种情况下我没有其他选择。
答案 0 :(得分:1)
如果您只需要第一个表格中的行(不清楚,但您的示例暗示了这一点),您可以使用JOIN
条件在没有EXISTS
的情况下执行此操作。类似的东西:
SELECT *
FROM table_x
WHERE EXISTS (SELECT 1 FROM table_y
WHERE table_x.id = table_y.id)
Here's the documentation了解此功能。
答案 1 :(得分:0)
这似乎是左连接的一个很好的用途。
SELECT T1.*, T2.*
FROM t1
LEFT JOIN t2 on T1.Pk_ID = T2.FK_ID
如果ID在两个表中都被索引,那么结果不应该在几分之一秒内返回。
使用笛卡尔是当3000 * 3000生效但加入笛卡尔时几乎消除了。证据就在于SQL的解释计划。答案 2 :(得分:0)
我认为您正在寻找EXISTS条款:
SELECT * FROM t1
WHERE EXISTS (SELECT NULL FROM t2 WHERE t1.ID = t2.ID)
答案 3 :(得分:0)
你也可以考虑这个例子(虽然我怀疑已经提供的那些更有效)......
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT * FROM ints x JOIN ints y ON y.i = 10;
SELECT x.* FROM ints x JOIN ints y ON y.i = 9;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+