SQL选择所有符合配料标准的菜肴

SQL选择所有符合配料标准的菜肴,sql,select,Sql,Select,我开始有一个头痛的计算/搜索查询,以选择所有菜肴,符合一些成分列表 我的桌子: Ingredients ============ ID IngredientName IngredientAmount P_ID Dishes ========== ID DishName DishIngredients ========== ID DishID IngredeientID IngredientAmount 有两个配料名称,我想选择所有我可以制作的菜肴(因此我想知道它们的p_ID)(将有许

我开始有一个头痛的计算/搜索查询,以选择所有菜肴,符合一些成分列表

我的桌子:

Ingredients
============
ID
IngredientName
IngredientAmount
P_ID


 Dishes
==========
ID
DishName


DishIngredients
==========
ID
DishID
IngredeientID
IngredientAmount
有两个配料名称,我想选择所有我可以制作的菜肴(因此我想知道它们的
p_ID
)(将有许多菜肴包含给定的子集,即5种配料。)

到目前为止,我们有以下几点:

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.ID
WHERE i.IngredientName IN ('salt','tomato')

虽然这将显示需要“番茄”但需要其他配料的菜肴,但我们没有在列表中。

我要做的是创建另一个表
dishcomponents
,列为
dishingRadientId
IngRadientId
,并将
IngRadientMount
移动到此表。
因为,举例来说,多种菜肴都可以用番茄作为配料,但用量不同

然后加入这三张桌子,找出哪些菜的配料是西红柿,比如:

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.IngredientId
WHERE i.IngredientName = 'Tomato'
(如果您想搜索多个成分,请使用子句中的
,就像您已经做的一样!)

我读过你的问题,也许这就是你的意思(任何成分):

它列出了所有可用的以番茄和奶酪为原料的菜肴。
也见此

如果您想要所有成分,请尝试以下方法:

SELECT d.DishName, A.IngredientName, B.IngredientName 
FROM Dishes AS d 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Cheese'
    WHERE d.DishID = di.DishID) AS A
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Tomato'
    WHERE d.DishID = di.DishID) AS B

对于每种额外的配料,添加另一种
交叉应用

您能分享一下您的菜谱表的结构吗?您好,请展示一下“菜谱”表的结构。好的,我已经根据您的建议重建了我的数据库,虽然my MySQL不喜欢您的语法:
如i.IngredientId上的i.IngredientId上的i.IngredientId
-第二个
上是意外的。我已经编辑了以下查询:
选择d.Name,i.IngredientName,di.IngRadientAmount FROM displays AS d internal JOIN dish components AS di ON d.DishId=di.DishId internal JOIN components AS i ON di.IngRadientId=i.IngRadientId=i.IngRadientId,其中i.IngRadientName IN(‘意大利面’,‘西红柿’)
但是它不起作用,因为它显示的是含有西红柿的菜肴,但同一道菜需要其他成分,没有提供。很抱歉,
上的第二个
是一个打字错误,它确实需要是一个
=
。您可以通过
构造来添加配料。我将更新查询以反映这一点。伙计,今天真的是星期五。。。一直把你的问题当作任何成分来读,但我认为你指的是所有成分。将再次更新。非常感谢CoolWilly的更新。我会很快检查结果!
SELECT d.DishName, A.IngredientName, B.IngredientName 
FROM Dishes AS d 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Cheese'
    WHERE d.DishID = di.DishID) AS A
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Tomato'
    WHERE d.DishID = di.DishID) AS B