0

のテーブル構造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テーブルの速度に関しては非常に似ているように見えます (そこにはあまりありません) productIDcatalog_product_category_bindings. 言うまでもなく、何も返されず、クエリが完全に中断される可能性があります (ただし、これは、テーブルが切り捨てられた場合にのみ発生します)。

どちらが良いと言えますか?個人的には、#1 の方が私のクエリ ビルダーにより適していて、全体的に優れているように見えるため、#1 を好みます。

4

1 に答える 1

1

すべての列がNOT NULLMySQLとして定義されているため、NOT IN()クエリは存在しないように最適化されます。両者の間に大きな違いはありません。

このトピックについては必読です。

于 2013-07-22T10:09:24.573 に答える