2014-07-03 19 views
0

我正在寻找一个替代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" 
+3

似乎毫无意义。为什么不只是一个'where category =马达和马力> 200和制造商= balor'? –

+0

你需要什么子查询?你不能只写一个where子句吗? – ragol

+0

你可以从字面上删除第4行和第6行,以及第2行的''''。 –

回答

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) 

如果你需要从你可以这样做第二台拉:

​​

您可以使用,如果你需要多个表的其他连接。

+0

+1就这么简单! :) –

+0

处理所示的WHERE子句就是这么简单。现在我看到复杂性在哪里。它位于每个子查询中,从其他表中选择条件。所以它可能会选择标签和值作为单一条件。这几乎就像它在移动到下一个过滤器之前必须先选择产品一样。 –

+0

从一张独立的桌子上拉起来几乎是一样的容易......看第二个 –