MySQL join:首次匹配返回

时间:2013-07-02 19:21:14

标签: mysql join

我在mySQL数据库中有两个表,我想对它们进行连接。想象一下,他们都有3000个条目。当mySQL执行查询时,它将返回3000 * 3000个可能的行。我想在一个表上运行查询,并在第二个表中找到匹配后立即返回每一行(因此,如果它在t2的第二行中找到匹配的行,则可以跳过其他可能的组合)。例如,这将是这样的

从t1中选择*其中至少有一个匹配(t1.id = t2.id)

mySQL有什么方法可以做到这一点吗?

我知道通常应该避免这种连接,但在这种情况下我没有其他选择。

4 个答案:

答案 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 |
+---+