2011-07-15 5 views
0

私は次のようなテーブル構造を持っています。 すべてのアクティブなカテゴリ と特定の親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 
+0

良い質問では、 "better''のあなたの定義は何ですか?" ですより速く(秒単位で)、より少ないリソース(CPUサイクルなど)、より読みやすく、保守性が高く、適応性が高く、コード行数が少ないなど – MatBailie

+0

コードの行数が少なく、CPUサイクルが少なくなりました。 CPUのサイクルが早くなるのではないでしょうか? – polyhedron

+0

あなたが並列性を持っていない場合。 2つのコア(1ではなく)を使用し、時間の25%を節約することができます。全体的には、CPU時間の150%を使用していますが、実際の時間の75%を使用しています。 – MatBailie

答えて

2

次のように代替レイアウトは可能性が...

SELECT 
    * 
FROM 
(
    SELECT 
    productCategories.categoryID 
    FROM 
    productCategories 
    INNER JOIN 
    categories 
     ON categories.categoryID = productCategories.parentID 
    INNER JOIN 
    products 
     ON products.productID = productCategories.productID 
    WHERE 
    categories.parentID = {$parentID} 
    AND categories.isActive = 1 
    AND products.isActive = 1 
    GROUP BY 
    productCategories.categoryID 
) 
    AS category_map 
LEFT JOIN 
    categories AS [children] 
    ON category_map.categoryID = categories.categoryID 
+0

は私にとって完璧なほど近くにあります。まさに私が探していたもので、INNER JOINの使い方をちょっと学んだ – polyhedron

関連する問題