我对性能有疑问,我猜我做错了。
我有一个包含Items的表,另一个包含Categories,任何一个项都可以在多个类别中。现在我想要显示所有项目都不包含在任何类别中。
表格Items_Categories
中的连接(只有ID_item
和ID_category
)
我提出了这个问题:
SELECT *
FROM Items AS i
WHERE ID_item NOT
IN (
SELECT DISTINCT ID_item
FROM Items_Categories
)
它有效,但速度很慢。这需要几秒钟,而我的数据库并不是那么大。我有大约3000个项目,也许有200个类别。
有更好的解决方案吗?
答案 0 :(得分:2)
你可以改用JOIN,找到那些没有匹配的东西。
SELECT i.*
FROM items i
LEFT JOIN Items_Categories ic
ON i.ID_item = ic.ID_Item
WHERE
ic.ID_Item IS NULL
答案 1 :(得分:1)
尝试这种方式:
SELECT i.*
FROM Items AS i
LEFT JOIN Items_Categories IC on IC.ID_item = I.ID_item
where IC.ID_item is null
答案 2 :(得分:0)
你可以采用这种方法,并使用EXPLAIN检查你和我的执行计划,正如Mark Baker建议的那样:
SELECT
*
FROM
Items i
WHERE NOT EXISTS (
SELECT 1 FROM Items_Categories WHERE ID_item = i.ID_item
);
当然,您应该在两个表中为ID_item列编制索引。