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

上述查询返回每个记录10230与外地达尔和值2
我想一个结果与现场总与价值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

'...作为行的计数...一个结果与结果'...呵呵? – 2012-01-17 14:47:05

+0

*“应该返回具有filter_id 22 **和** 2的产品的数量”*但“HAVING count(product_id)= 1”表示22 **或** 2.这是什么原因? – 2012-01-17 14:51:03

+0

抱歉,由于缺乏清晰度,我更清楚地阐述了我的问题 – 2012-01-17 21:14:47

回答

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'