在这种情况下,有没有办法避免多个嵌套选择?

时间:2012-03-27 07:39:40

标签: mysql

我有一张产品可能有这样的选项的表格(1个产品可以有很多选项): products_id options_id

现在我需要选择所有具有 ALL 3个选项1,2,3的所有products_ids然后我必须做这样的事情

select products_id 
from options 
where products_id in 
     (select products_id 
      from options 
      where products_id in 
              (select products_id 
               from options 
               where options_id = 3) 
      and options_id = 2)
and options_id = 1

如果我必须说10个选项,这似乎非常无效。我想知道是否有办法绕过这一切

编辑: 我按要求提供了一些样本数据:

products_id           options_id
1                     1
1                     2
1                     3
1                     4
1                     5
2                     1
2                     2
2                     3
3                     2
3                     3
3                     9
4                     1
4                     2
4                     8

如果我们使用上面的sql,我们应该只获得具有所有选项1,2,3的产品1,2。其他人(3,4)没有所有必需的选项

4 个答案:

答案 0 :(得分:0)

您应该使用递归函数并在表格中保留一个字段“parent_id”以找到所有相关产品

答案 1 :(得分:0)

您可以使用或运算符选择distinct:

select distinct products_id from options where options_id = 1 OR options_id = 2 OR options_id = 3

编辑: 上面的答案显然是错误的。但我认为按产品分组然后检查计数将解决问题。

SELECT products_id FROM (SELECT products_id, count(*) AS cnt FROM options WHERE options_id = 1 OR options_id = 2 OR options_id = 3 GROUP BY products_id) WHERE cnt = 3

答案 2 :(得分:0)

enter code here您可以尝试以下select语句:

Select Products_Id from Options Where Options_id IN(1,2,3)

如果您的所有数据都在同一个表格中。

如果您想从产品表中选择产品,如选项表中的options_id = 1/2/3,您可以使用以下

Select field1, field2, * from products where products_id in (Select Products_Id from options where options_id IN(1,2,3))

假设您的表创建如下: 产品(product_id,产品编号,描述,颜色......) 选项(option_id,名称,描述,....) Options_for_Products(product_Id,Option_id)

您可以使用以下子查询:

Select * from products where product_id IN(Select Product_id from Options_for_Products Where Option_Id IN (Select Option_Id from Options where Name='whatevernameyouwant')) // get product using option name.

Select Product_Id FROM Options_for_Products where Option_Id IN(Select Option_Id from Options where Name='whatevernameyouwant') // getting product_id from Options_for_Products using option name.

Select Product_Id from Options_for_Products where Option_id IN(1,2,3) // this is what you asked for. using option ID.

如果你想选择必须具有所有三个条件的Product_id,而不是使用“Option_id IN(1,2,3)”,你必须将它们分成3个不同的ditional AND语句,如下所示:Select Products_Id FROM Options Where Products_Id IN(Select Products_id from Option Where Options_id = 1) AND Product_ID IN(Select Products_Id from Options where options_id = 2) AND Products_Id IN(Select Products_id from Options where options_id = 3)

答案 3 :(得分:0)

如果您使用的是MS SQL,那么就会出现一个split()函数。

创建该功能并执行以下步骤。我不打算编写SQL代码,只是让你想到它。

创建一个名为GetProductIdsForOptions的存储过程,该过程具有单个输入参数,假设@OptionIds的类型为nvarchar(无论你想要什么),这将是一个逗号分隔的值字符串

创建一个诱饵表(create table#table1 syntax)。包含splitted options_Id

插入#table1从dbo.split中选择不同的值(@optionIds,',')

创建另一个tempt表以包含products_id和options_id

插入#table2选择distinct products_id,options_id from Options Where Options_id IN(从#table1中选择optionId)

然后

从#table2中选择Products_id按产品分组_id有计数(options_id)=(从#table1中选择计数(*))

查询尚未经过测试。这只是一个如何绕过它的想法。