Mysql 我想展示包含给定成分但也包含其他成分的配方

Mysql 我想展示包含给定成分但也包含其他成分的配方,mysql,sql,Mysql,Sql,关于我的第一个问题 我的第一个问题是关于显示配方的问题。当所有配料都用完时,下一件事不知何故与第一件事相同,但它需要显示配方(与第一件一样具有给定的配料)以及能够完成此配方的一些配料。对不起,我的英语不好。我希望你明白我的意思 为了根据成分列表查找食谱列表,如果食谱必须包含这些成分,但也可能包含更多成分,您可以尝试以下方法: SELECT R.name FROM Recipe R, Ingredients I, Relationship Rel WHERE I.ingredients_name

关于我的第一个问题


我的第一个问题是关于显示配方的问题。当所有配料都用完时,下一件事不知何故与第一件事相同,但它需要显示配方(与第一件一样具有给定的配料)以及能够完成此配方的一些配料。对不起,我的英语不好。我希望你明白我的意思

为了根据成分列表查找食谱列表,如果食谱必须包含这些成分,但也可能包含更多成分,您可以尝试以下方法:

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id

INTERSECT

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id
这样做的目的是找到所有以“鸡肉”为配料的食谱,并将其与所有以“蛋黄酱”为配料的食谱交叉。这将为您提供食谱,其中“鸡肉”和“蛋黄酱”都是给定食谱的成分


仔细想想,MySQL没有INTERSECT关键字。在这种情况下,请尝试以下方法:

SELECT DISTINCT R.name FROM Recipe R
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
              Rel.recipe_id=R.id) as recipeA
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
               Rel.recipe_id=R.id) as recipeB

为了根据成分列表查找食谱列表,如果食谱必须包含这些成分,但也可能包含更多成分,您可以尝试以下方法:

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id

INTERSECT

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id
这样做的目的是找到所有以“鸡肉”为配料的食谱,并将其与所有以“蛋黄酱”为配料的食谱交叉。这将为您提供食谱,其中“鸡肉”和“蛋黄酱”都是给定食谱的成分


仔细想想,MySQL没有INTERSECT关键字。在这种情况下,请尝试以下方法:

SELECT DISTINCT R.name FROM Recipe R
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
              Rel.recipe_id=R.id) as recipeA
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
               Rel.recipe_id=R.id) as recipeB

我认为simchona可能有一些好的方面,但显然,您必须在一个循环中生成代码,为每个成分生成一个select子句

一些人解决类似问题的另一种方法是将一列聚合成一个字符串并进行测试。我认为这两种方法在性能和可维护性方面都有利弊。如果要研究此方法,可以从以下位置开始决定如何连接字符串:


另一个选项是创建一个存储过程,并在循环中使用一些TSQL来生成匹配项的列表。。。当然,这是我通常会选择的最后一个选项,但这取决于您需要的性能有多好,这可能是一个可行的选择。

我认为simchona可能会有一些好的选择,但您显然必须在一个循环中生成代码,为每个成分生成一个select子句

一些人解决类似问题的另一种方法是将一列聚合成一个字符串并进行测试。我认为这两种方法在性能和可维护性方面都有利弊。如果要研究此方法,可以从以下位置开始决定如何连接字符串:

另一个选项是创建一个存储过程,并在循环中使用一些TSQL来生成匹配项的列表。。。当然,这是我通常会选择的最后一个选项,但取决于您需要的性能,这可能是一个可行的选择。

与我对第一个问题的回答(现在已更正)类似-这应该返回包含所有指定成分的所有配方,但还需要其他成分:

SELECT r.* from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
GROUP BY r.id
HAVING COUNT(DISTINCT i.ingredients_name)>2 AND
       COUNT(DISTINCT case when i.ingredients_name IN ('chicken','mayonnaise') 
                           then i.ingredients_name end)=2
与我对第一个问题的回答(现已更正)类似-这应该返回包含所有指定成分的所有配方,但也需要额外成分:

SELECT r.* from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
GROUP BY r.id
HAVING COUNT(DISTINCT i.ingredients_name)>2 AND
       COUNT(DISTINCT case when i.ingredients_name IN ('chicken','mayonnaise') 
                           then i.ingredients_name end)=2

我认为以下查询将满足要求:

SELECT r.recipe_name from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
where i.ingredients_name IN ('chicken','mayonnaise')
GROUP BY r.recipe_name
HAVING COUNT(i.ingredients_name) > 1

我认为以下查询将满足要求:

SELECT r.recipe_name from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
where i.ingredients_name IN ('chicken','mayonnaise')
GROUP BY r.recipe_name
HAVING COUNT(i.ingredients_name) > 1


重复的,相同的用户。@MichaelPetrotta这不是重复的,我想从这个问题得到的结果与我问的第一个不一样。。对不起,我英语不好。。你能帮我吗?非常感谢你的帮助。rjx44,你的两个问题有什么区别?@simchona我很抱歉我的问题,但我对第二个问题的意思与我的第一个问题相反。。这里真的需要帮助..:-(@MichaelPetrotta感谢您的回答。我想显示包含给定成分的配方,但需要另一种成分来完成该配方。.基本上,这是我之前问的第一个问题中的一种暗示类型。.重复的,相同的用户。@MichaelPetrotta这不是重复的,我希望从这个问题中得到结果我问的问题和我问的第一个问题不一样。对不起,我的英语不好。你能帮我吗?非常感谢你的帮助。你的两个问题有什么不同,rjx44?@simchona我很抱歉我的问题,但我对第二个问题的意思与我的第一个问题相反。我真的需要帮助-(@MichaelPetrotta谢谢你的回答。我想展示包含给定成分的配方,但需要另一种成分来完成该配方。。基本上,这是我之前问的第一个问题中的一种暗示类型。+1-似乎还有更简单的东西,但我不确定是否有。@BrandonMoore I我在想也许加入会更有帮助?但这种方式(尽管速度较慢)在概念上相对容易理解。如果你有一个更简单的版本,我会投票给你。这会导致我在这里出错…:-(#1064-您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解可在第行“INTERSECT SELECT R.name FROM Recipe R,Components I,Relation Rel WHERE”附近使用的正确语法6@rjx44现在试试?我用了一个MySQL中没有的关键字,我肯定会创建一个叫做li的视图ke vwRecipe_首先将表连接在一起,然后引用该视图。这将使sql更具可读性和可维护性。+1-看起来应该还有更简单的方法,但我不确定是否有。@BrandonMoore我想连接可能更有帮助?但这种方法(尽管速度较慢)是相对的