2012-01-17 10 views
0

私は最適化したいクエリがあります。私はこのクエリーを改善できると確信しています。mysqlのリンクテーブル+結合+カウント

この結果、filter_id 22と2を持つ商品の数が返され、 'yes'と表示されます。

SELECT COUNT(product_id) AS Total 
FROM kkx_filters_products 
    LEFT JOIN kkx_products ON product_id = kkx_products.id 
WHERE filter_id IN (2,22) 
    AND kkx_products.display = 'yes' 
GROUP BY product_id 
HAVING count(product_id) = 2 

上記のクエリは、私が合計フィールドと値の結果を1つ欲しい合計フィールドと値2
で10230のレコードのそれぞれを返す10230.

私はの構造を含めましたテーブルがクエリで使用されています。

EXPLAIN kkx_filters;

Field   Type     Null Key  Default  Extra 
id    int(11) unsigned  NO PRI  NULL   auto_increment 
name    varchar(50)   NO    

EXPLAIN kkx_filters_products;

Field   Type     Null Key Default   Extra 
filter_id  int(11)    NO PRI 0  
product_id  int(11)    NO PRI 0 

EXPLAIN kkx_products;

Field   Type     Null Key Default   Extra 
id    int(11)    NO PRI NULL    auto_increment 
title   varchar(255)   NO    
display   enum('yes','no')  NO   yes  
+0

'...カウントが行... 1つの結果に結果が表示されます。 –

+0

* "は、filter_id 22 **と** 2"を持つ製品の数を返します。*しかし、 'HAVING count(product_id)= 1'は、22 **または** 2を意味します。 –

+0

わかりにくいことに申し訳ありませんが、私は質問をより明確に定式化しました –

答えて

0

あなたはでクエリをラップすることができます:

SELECT COUNT(*) 
FROM 
    (yourquery) AS tmp 

が、それは非常に効率的ではありません。代わりに、productsテーブルをフィルタテーブルに2回追加します。

SELECT 
     COUNT(*) AS Total 
FROM 
     kkx_products AS p 
    JOIN 
     kkx_filters_products AS f1 
    ON f1.product_id = p.id 
    AND f1.filter_id = 2 
    JOIN 
     kkx_filters_products AS f2 
    ON f2.product_id = p.id 
    AND f2.filter_id = 22 
WHERE 
     p.display = 'yes' 
関連する問題