从定义的子集中搜索列中值的所有组合
Search for all combinations of values in a column from a defined subset
我在 MySQL
中有一个具有以下架构的 table
Recipe_Quantity_ID,Recipe_ID,Recipe_Quantity,Ingredients_ID,Ingredient_Measurement_ID
示例数据可以在此 SQL Fiddle http://sqlfiddle.com/#!2/d05fe 中找到。
我想在 table 中搜索给定的(一个或多个)Ingredients_ID 和 return Recipe_ID 有这个 Ingredients_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 等
有什么想法可以搜索所有可能为真的组合吗?提前致谢。
这样的怎么样?
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
更改为要匹配的最少成分数。
我的理解是,您想在已经拥有所需所有成分的情况下获得所有食谱。你不需要使用你所有的原料,但你不想去购物。
如果我错了请纠正我,但我认为没有适合您配料表的食谱,所以我使用了其他配料。请注意,不会使用成分 13,36。
您应该可以在括号中添加另一个 select 语句来获取您拥有的成分(select ingredients_id 来自 ingredients_owned),但事实并非如此最好每次都指定它们。
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
我在 MySQL
中有一个具有以下架构的 tableRecipe_Quantity_ID,Recipe_ID,Recipe_Quantity,Ingredients_ID,Ingredient_Measurement_ID
示例数据可以在此 SQL Fiddle http://sqlfiddle.com/#!2/d05fe 中找到。
我想在 table 中搜索给定的(一个或多个)Ingredients_ID 和 return Recipe_ID 有这个 Ingredients_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 等
有什么想法可以搜索所有可能为真的组合吗?提前致谢。
这样的怎么样?
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
更改为要匹配的最少成分数。
我的理解是,您想在已经拥有所需所有成分的情况下获得所有食谱。你不需要使用你所有的原料,但你不想去购物。
如果我错了请纠正我,但我认为没有适合您配料表的食谱,所以我使用了其他配料。请注意,不会使用成分 13,36。
您应该可以在括号中添加另一个 select 语句来获取您拥有的成分(select ingredients_id 来自 ingredients_owned),但事实并非如此最好每次都指定它们。
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