Database design 选择与某些输入条件匹配的记录

Database design 选择与某些输入条件匹配的记录,database-design,relational-database,Database Design,Relational Database,我正在尝试实现一个Web服务,它将把一些成分作为输入,它将在数据库中查找一些Recipe,并将返回那些需要提供全部或部分成分作为输入的成分 我可以很容易地算出食客和食客之间的多对多关系,所以我打算有一张餐桌,一份配料,一张中间的链接表。但是,如果我这样做,我不确定如何以有效的方式查询表以获得所需的信息 给出一个明确的例子,考虑如下: 输入:意大利面、鸡肉、香蒜酱、西红柿 输出应为: 番茄酱鸡肉意大利面(需要意大利面、鸡肉和西红柿) 在烤箱中加入香蒜酱的意大利面(需要意大利面和香蒜酱) 等等

我正在尝试实现一个Web服务,它将把一些成分作为输入,它将在数据库中查找一些Recipe,并将返回那些需要提供全部或部分成分作为输入的成分

我可以很容易地算出食客和食客之间的多对多关系,所以我打算有一张餐桌,一份配料,一张中间的链接表。但是,如果我这样做,我不确定如何以有效的方式查询表以获得所需的信息

给出一个明确的例子,考虑如下:

输入:意大利面、鸡肉、香蒜酱、西红柿 输出应为:

  • 番茄酱鸡肉意大利面(需要意大利面、鸡肉和西红柿)
  • 在烤箱中加入香蒜酱的意大利面(需要意大利面和香蒜酱)
  • 等等
但产量不应包括番茄酱土豆鸡肉(因为我们的输入成分中没有土豆)

我将在Java和MySQL中实现这一点(尽管Java部分对于这个问题可能并不重要)

有人能帮我解决这个问题吗。我真的很想知道如何实现这个查询,但是如果你能想出其他方法来实现它,那么这些方法也很受欢迎


提前感谢

首先,将您的“所需”成分列表放在临时表格中。让我们称之为“渴望”

以下查询将查找所需表中仅包含成分的配方:

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子句。