MySQL从表1中选择不存在连接的行的有效方法

时间:2015-10-19 13:09:25

标签: php mysql

我为此尝试了一堆答案,但没有一个能为我工作。

Find records where join doesn't exist

Select * from table1 that does not exist in table2 with conditional

我有2张桌子。 1是具有约50,000个项目的项目表。第二个是超过100,000行的评级表。我想得到所有没有任何选票的物品。

我尝试了以下内容,它似乎有效,但似乎冻结了,可能是因为它必须检查这么多记录。是否有更有效的方法来实现这一目标。

  

SELECT title FROM items LEFT JOIN itemvotes ON items.id =   itemvotes.itemid WHERE itemvotes.vote IS NULL

我确定这个查询最终会返回结果,但我需要这个是一个快速的东西,可以从php网页检查,所以它需要在几秒钟内加载。

只是为了确认。上述查询花了3分多钟才能返回结果。这是有效的,但速度太慢了。

2 个答案:

答案 0 :(得分:1)

子查询可能会更快:

SELECT title FROM items
WHERE id NOT IN (
    SELECT itemid
    FROM itemvotes 
)

当您进行外部联接时,它首先加入然后搜索,因此它正在搜索50,000 * 100,000行。如果您执行子查询,则查看最多50,000 + 100,000。当然,您还必须确保两个表都有适当的索引。

答案 1 :(得分:1)

为什么不使用类似的东西:

 SELECT * FROM `table1` WHERE `id` NOT IN SELECT `table1_id` FROM `table2`

table1_id当然是外键。