-1

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

select * from t1 where至少一个匹配(t1.id = t2.id)

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

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

4

4 回答 4

1

如果您只需要第一个表中的行(尚不清楚,但您的示例暗示了这一点),您可以JOIN通过使用EXISTS条件来做到这一点。就像是:

SELECT *
FROM table_x
WHERE EXISTS (SELECT 1 FROM table_y
              WHERE table_x.id = table_y.id)

这是此功能的文档

于 2013-07-02T19:30:59.330 回答
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 |
+---+
于 2013-07-02T20:34:47.617 回答
0

我认为您正在寻找 EXISTS 子句:

SELECT * FROM t1
WHERE EXISTS (SELECT NULL FROM t2 WHERE t1.ID = t2.ID)
于 2013-07-02T19:30:06.477 回答
0

This seems to be a good use for a left join.

SELECT T1.*, T2.*
FROM t1 
LEFT JOIN t2 on T1.Pk_ID = T2.FK_ID

if the ID's are indexed in both tables there's no reason the results shouldn't return in fractions of a second.

using a Cartesian is when the 3000*3000 takes effect but by joining the Cartesian is nearly eliminated. Evidence of this is in the explain plan of the SQL.

于 2013-07-02T19:26:13.310 回答