【问题标题】:mysql linked table + join + countmysql链表+连接+计数
【发布时间】:2012-02-12 08:51:30
【问题描述】:

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

查询的结果应该返回 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 的结果。

我已经包含了查询中使用的表的结构。

解释 kkx_filters;

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

解释 kkx_filters_products;

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

解释 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    

【问题讨论】:

  • ... the count as rows... one result with the result...嗯?
  • "应该返回 filter_id 为 22 2"的产品数量,但HAVING count( product_id ) = 1 表示 22 或 2. 是哪一个?
  • 对不起,我的问题表述得更清楚了

标签: mysql optimization count


【解决方案1】:

您可以使用以下方式包装您的查询:

SELECT COUNT(*)
FROM
  ( yourquery ) AS tmp

但它不会很有效。相反,将 products 表连接到 filter 表,两次:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多