2012-01-17 2 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 

위의 쿼리 내가 총 필드와 값을 하나 개의 결과를하고자하는 전체 필드와 값 2
로 10,230 기록을 각각 반환 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

'... 개수가 행으로 계산됩니다. 결과 중 하나 결과가 ... ... 허? –

+0

* "filter_id 22 ** 및 ** 2"*가있는 제품 수를 반환해야합니다. 그러나 'HAVING count (product_id) = 1'은 22 ** 또는 ** 2를 의미합니다. –

+0

명확성이 부족하여 죄송합니다. 제 질문을보다 명확하게 공식화했습니다. –

답변

0

당신은 당신의 쿼리를 래핑 수 :

SELECT COUNT(*) 
FROM 
    (yourquery) AS tmp 

그러나 그것은 매우 효율적으로하지 않습니다. 대신 제품 테이블을 필터 테이블에 두 번 결합하십시오.

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'