从定义的子集中搜索列中的所有值组合

时间:2015-01-01 17:04:37

标签: php mysql sql select

我在MySQL中有一个包含以下模式的表

Recipe_Quantity_ID,Recipe_ID,Recipe_Quantity,Ingredients_ID,Ingredient_Measurement_ID

可以在此SQL Fiddle http://sqlfiddle.com/#!2/d05fe中找到示例数据。

我想在表中搜索给定(一个或多个)Ingredients_ID并返回具有此Ingredients_ID的Recipe_ID

我是通过使用此SQL

来实现的
select Recipe_ID 
from   recipe_quantity
group by Recipe_ID 
having count(*) = {$ar_rows} 
and    sum(Ingredients_ID in ({$ids})) = {$ar_rows}

可能转化为

select Recipe_ID 
from   recipe_quantity 
group by Recipe_ID 
having count(*) = 4 
and    sum(Ingredients_ID in (8,5,45,88)) = 4

为了搜索更少的Ingredients_ID,我减去最后一个ID,直到我达到一个成分ID。当然,使用这种技术无法搜索所有组合。例如8,5,45,85 | 8,45,85 | 45,85 | 5,45,85等。

我有什么想法可以搜索可能属实的所有组合?提前谢谢。

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

select Recipe_ID, group_concat(Ingredients_ID), count(*) as ingredients
from   recipe_quantity 
where Ingredients_ID IN (8,5,45,88)
group by Recipe_ID 
having ingredients > 0
order by ingredients desc

不是将所有配方成分分组,然后过滤掉那些不包含您正在寻找的成分的配方,我只匹配recipe_quantity中与第一个成分相匹配的条目地点。我使用group_concat,因此您可以看到匹配的成分集。

按照匹配的成分数量排序,但仍保留一种或多种成分的部分匹配。您将0更改为要匹配的最小成分数。

答案 1 :(得分:0)

我的理解是,您希望获得所有已经拥有所需成分的食谱。你不需要使用你拥有的所有成分,但你不想去购物。

如果我错了,请纠正我,但我不认为有适合你的食材清单的食谱,所以我使用了其他成分。请注意,不会使用成分13,36。

你应该能够在括号中放入另一个select语句来获取你所拥有的成分(从ingredients_owned中选择ingredients_id),每次指定它们都不是很好。

select distinct c.Recipe_id
from
  (select Recipe_ID
  from recipe_quantity 
  where Ingredients_ID in (5,6,1,11,8,12,13,36, 81,82,62,73,35)) c
  left join (select Recipe_ID
              from   recipe_quantity 
              where Ingredients_ID not in (5,6,1,11,8,12,13,36, 81,82,62,73,35)) x
    on c.Recipe_id = x.Recipe_id
where x.Recipe_id is null