我在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等。
我有什么想法可以搜索可能属实的所有组合?提前谢谢。
答案 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