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是有关该主题的必读内容。

10-04 10:36