表结构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,因为它更适合我的查询构建器,而且看起来通常更好。