Database design 选择与某些输入条件匹配的记录
我正在尝试实现一个Web服务,它将把一些成分作为输入,它将在数据库中查找一些Recipe,并将返回那些需要提供全部或部分成分作为输入的成分 我可以很容易地算出食客和食客之间的多对多关系,所以我打算有一张餐桌,一份配料,一张中间的链接表。但是,如果我这样做,我不确定如何以有效的方式查询表以获得所需的信息Database design 选择与某些输入条件匹配的记录,database-design,relational-database,Database Design,Relational Database,我正在尝试实现一个Web服务,它将把一些成分作为输入,它将在数据库中查找一些Recipe,并将返回那些需要提供全部或部分成分作为输入的成分 我可以很容易地算出食客和食客之间的多对多关系,所以我打算有一张餐桌,一份配料,一张中间的链接表。但是,如果我这样做,我不确定如何以有效的方式查询表以获得所需的信息 给出一个明确的例子,考虑如下: 输入:意大利面、鸡肉、香蒜酱、西红柿 输出应为: 番茄酱鸡肉意大利面(需要意大利面、鸡肉和西红柿) 在烤箱中加入香蒜酱的意大利面(需要意大利面和香蒜酱) 等等
给出一个明确的例子,考虑如下:
输入:意大利面、鸡肉、香蒜酱、西红柿 输出应为:- 番茄酱鸡肉意大利面(需要意大利面、鸡肉和西红柿)
- 在烤箱中加入香蒜酱的意大利面(需要意大利面和香蒜酱)
- 等等
提前感谢首先,将您的“所需”成分列表放在临时表格中。让我们称之为“渴望” 以下查询将查找所需表中仅包含成分的配方:
select r.recipe.name, group_concat(i.ingredientname separator ', ') as ingredients,
count(*) as numingredients
from RecipeIngredient ri join
Recipe r
on ri.recipeid = r.recipeid join
Ingredient i
on ri.ingredientid = i.ingredientid left outer join
Desired d
on i.ingredientname = d.ingredientname
group by r.recipe.name
having max(case when d.ingredientname is null then 1 else 0 end) = 0 -- all ingredients in list
这个看起来很好。我需要一些时间来消化,但我认为它应该有效。我会尝试一下,然后让你知道。再看看这个问题,在没有尝试过的情况下,我认为有一个问题:我相信它不会返回只有部分成分的配方。我的要求是返回所有成分都在我的列表中的配方(反之亦然)。我读错了吗?@Lefteris。这应该会返回所有配方,其中所有成分都在您的列表中,尽管并非所有成分都可以使用。关键是左join和having子句。如果它发现一个成分不在列表中,那么d.ingredientname将为null,并且记录将不符合having子句。