私は次のようなテーブル構造を持っています。 すべてのアクティブなカテゴリ と特定の親IDの が選択されています。カテゴリ/製品関係のためにこのSQLクエリを最小限に抑えていますか?
特定のparentIDを接続すると、アクティブな製品を含む親の関連するアクティブなサブカテゴリのみが取得されます。
これは今までのところ私のsql(mysql)ですが、かなりうまく見えますが、アカデミアのためにはもっと良い方法があるかどうかを知りたいのです。結果をフィルタリングするためにアクティブなすべてのproductIDを選択するのは無駄ですが、私はこれを回避する方法が見つからないか、mysqlがこのクエリを処理する最良の方法を見つけ出すのでしょうか?
(many-to-many upon itself)
categories
----------
categoryID
parentID
name
isActive (bool)
(linker table between categories and product)
productCategories
-----------------
productID
categoryID
products
--------
productID
name
isActive (bool)
SELECT productCategories.categoryID, categories.* FROM productCategories
LEFT JOIN categories ON
productCategories.categoryID = categories.categoryID
WHERE
productCategories.categoryID IN
(SELECT categoryID FROM categories WHERE parentID = {$parentID} AND isActive = 1)
AND
productCategories.productID IN
(SELECT productID FROM products WHERE isActive = 1)
GROUP BY productCategories.categoryID
良い質問では、 "better''のあなたの定義は何ですか?" ですより速く(秒単位で)、より少ないリソース(CPUサイクルなど)、より読みやすく、保守性が高く、適応性が高く、コード行数が少ないなど – MatBailie
コードの行数が少なく、CPUサイクルが少なくなりました。 CPUのサイクルが早くなるのではないでしょうか? – polyhedron
あなたが並列性を持っていない場合。 2つのコア(1ではなく)を使用し、時間の25%を節約することができます。全体的には、CPU時間の150%を使用していますが、実際の時間の75%を使用しています。 – MatBailie