我有一张产品可能有这样的选项的表格(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)没有所有必需的选项
答案 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中选择计数(*))
查询尚未经过测试。这只是一个如何绕过它的想法。