MySQL:查询以获取使用所有给定成分的食谱

MySQL:查询以获取使用所有给定成分的食谱,mysql,mysql-error-1146,mysql-error-1248,Mysql,Mysql Error 1146,Mysql Error 1248,我有以下简化表格: CREATE TABLE recipe(id int, name varchar(25)); CREATE TABLE ingredient(name varchar(25)); CREATE TABLE uses_ingredient(recipe_id int, name varchar(25)); 我想做一个查询,返回包含鸡肉和奶油的食谱的所有id 我试过了 SELECT recipe_id FROM uses_ingredient INNER JOIN

我有以下简化表格:

CREATE TABLE recipe(id int, name varchar(25));  
CREATE TABLE ingredient(name varchar(25));  
CREATE TABLE uses_ingredient(recipe_id int, name varchar(25));
我想做一个查询,返回包含鸡肉和奶油的食谱的所有id

我试过了

SELECT recipe_id FROM uses_ingredient INNER JOIN  
(SELECT * FROM ingredient WHERE name="Chicken" OR name="Cream")  
USING (name) GROUP BY recipe_id  
HAVING COUNT(recipe_id) >= (SELECT COUNT(*) FROM theme);  
这给了我:错误1248 42000:每个派生表都必须有自己的别名 这可能也是错误的

接下来我试着

SELECT recipe_id FROM 
(SELECT * FROM ingredient WHERE name="Chicken" OR name="Cream") AS t 
INNER JOIN uses_ingredient USING (name) 
GROUP BY recipe_id HAVING 
COUNT(recipe_id)>= (SELECT COUNT(*) FROM t);
这导致错误1146 42S02:表'recipedb.t'不存在


我希望避免创建临时表,包括使用ENGINE=MEMORY。

可能有更好的方法来考虑它,但我认为答案是两组的交叉点:一组是鸡肉食谱,另一组是奶油食谱。如果您简化的不仅仅是列的数量,那么这可能不适用于您。但我试了几张唱片,看起来不错

SELECT CH.Recipe_Id
FROM
  (SELECT Recipe_Id
  FROM Uses_Ingredient
  WHERE Name = 'Chicken') CH
INNER JOIN 
  (SELECT Recipe_Id
  FROM Uses_Ingredient
  WHERE Name = 'Cream') CR
  ON CR.Recipe_Id = CH.Recipe_Id

我同意美赞臣银行;它是两个集合的交集。所以我只需要拿两套,看看它们都有什么

SELECT *
    FROM recipe
    WHERE EXISTS (SELECT *
                      FROM uses_ingredient
                      WHERE uses_ingredient.recipe_id = recipe.recipe_id AND
                            uses_ingredient.name      = "Chicken") AND
          EXISTS (SELECT *
                      FROM uses_ingredient
                      WHERE uses_ingredient.recipe_id = recipe.recipe_id AND
                            uses_ingredient.name      = "Cream");

其他的建议很好,但这里有另一种方法。这实际上似乎是您在查询中试图做的事情。虽然我不知道为什么在uses_配料中似乎包含相同的信息名称时,您有和配料表

SELECT recipe_id, count(*) c FROM uses_ingredient
WHERE name="Chicken" OR name="Cream"
GROUP BY recipe_id
HAVING c=2

在您的示例中,您引用了一个名为THEME的表。我不知道那是为了什么,所以我在回答中没有提到。如果重要,请在问题中添加详细信息。您看到的错误有一个简单的修复方法,请在派生查询后添加名称。从…中选择配方id。。。加入选择。。。我更喜欢你的想法。但这两种方法都不适用。例如,如果您希望所有食谱都包含4种特定成分,则必须更改计数。此外,您不需要选择计数,只需使用countstar=2就足够了。更好的是,如果你在“a”和“b”中说出名字的位置,你可以简化得更多。您可以计算该数组中的元素数,并说出countstar=@nbr或其他任何位置。