我为此尝试了一堆答案,但没有一个能为我工作。
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分多钟才能返回结果。这是有效的,但速度太慢了。
答案 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当然是外键。