我正在寻找以下语句的替代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"
答案 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'
如果您需要多个表格,可以使用其他联接。