catalog_product_category_bindings
的表结构:
`productID` INTEGER UNSIGNED NOT NULL
`categoryID` INTEGER UNSIGNED NOT NULL
catalog_products
的表结构:`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT
misc unrelated columns
任务:获取未绑定到任何类别的所有产品的数据(
catalog_product_category_bindings
中没有条目)。查询#1(使用LEFT JOIN):
SELECT cp.* FROM catalog_products AS cp
LEFT JOIN catalog_product_category_bindings AS cpcb
ON cp.id = cpcb.productID
WHERE cpcb.categoryID IS NULL
查询2(使用嵌套选择):
SELECT cp.* FROM catalog_products AS cp
WHERE id NOT IN
(SELECT productID FROM catalog_product_category_bindings)
就我的表的速度而言,两个查询似乎都非常相似(我在那里没有很多),但我相信第二个查询的性能较差,因为它可能遍历
id
表中的每个catalog_products
并将其与productID
中的每个catalog_product_category_bindings
进行比较。更不用说它可能不会返回任何内容并完全中断查询(尽管只有在表被截断的情况下才会发生)。您说哪个更好?我个人更喜欢#1,因为它更适合我的查询生成器,而且看起来通常更好。
最佳答案
由于所有列均定义为NOT NULL
,因此MySQL会优化NOT IN()
查询以使其不存在。两者之间没有太大区别。
Here是有关该主题的必读内容。