のテーブル構造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 の方が私のクエリ ビルダーにより適していて、全体的に優れているように見えるため、#1 を好みます。