mysql链接表+ join + count

时间:2012-01-17 14:42:55

标签: mysql optimization count

我有一个我想要优化的查询。我确定这个查询可以改进。

查询结果应返回具有filter_id 22和2且显示“是”的产品数。

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条记录,每条记录的字段为Total,值为2 我想要一个字段为Total且值为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    

1 个答案:

答案 0 :(得分:0)

您可以使用以下命令包装查询:

SELECT COUNT(*)
FROM
  ( yourquery ) AS tmp

但效率不高。而是将products表连接到过滤器表,两次:

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'