产品过滤器的WHERE IN子句的替代方法

时间:2014-07-03 19:12:36

标签: mysql sql

我正在寻找以下语句的替代SQL查询:

SELECT COUNT(`id`) FROM `products`
    WHERE 
      `category` = "Motors" AND 
      `id` IN(SELECT `id` FROM `products` WHERE 
                `Horsepower` > 200 AND 
                `id` IN(SELECT `id` FROM `products` WHERE 
                          `Manufacturer` = "Baldor"))

正如您所看到的,理论上(因为我没有专门测试它)子查询所有选择的产品ID。然后,从最终的产品ID列表生成COUNT。当存在许多嵌套查询时,此方法可能会变慢。

我正在研究过滤系统。因此,选择了一个或多个过滤器和子过滤器,并根据当前选择生成COUNT。

如果我可以创建一个SQL语句来返回基于任意数量的子过滤器的产品数量(不创建“WHERE IN”子句),那将是非常棒的。

上述查询可以简单地仅使用WHERE ... AND子句。问题在于使用类似下面的内容作为子查询,因为它需要选择多个条件:

SELECT `products`.`id` FROM `products` 
  LEFT JOIN `attributes` ON `attributes`.`product_id` = `products`.`id`
  WHERE `attributes`.`Label` = "Horsepower" AND
        `attributes`.`Value` > 200
SELECT `products`.`id` FROM `products` 
  LEFT JOIN `attributes` ON `attributes`.`product_id` = `products`.`id`
  WHERE `attributes`.`Label` = "Category" AND
        `attributes`.`Value` = "Motors"

1 个答案:

答案 0 :(得分:3)

你为什么需要in?只是和要求一起

select count(`id`) from `products` where category = "Motors" and `HorsePower` > 200 and `Manufacturer` = "Baldor"

在代码中执行此操作的常用技巧,假设您没有使用ORM(坦率地说,鉴于您提出的问题可能应该是这样),这将是这样的

#Python
conds = ['category = "Motors"', '`Horsepower` > 200']
query = 'SELECT COUNT(`id`) FROM `products` WHERE ' + ' and '.join(conds)

如果您需要从第二张桌子拉出来,您可以执行以下操作:

select count(products.id) from products left join extra on extra.product_id = products.id where products.category = 'foo' and extra.fielda = 'blah' and extra.fieldb = 'bar'

如果您需要多个表格,可以使用其他联接。