2010-06-10 42 views
0

我有以下簡化表食譜:的MySQL:查詢,以獲得使用所有給定的成分

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); 

這給了我:「ERROR 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); 

這給「ERROR 1146(42S02):表 'recipedb.t' 不存在」

我想避免創建臨時表,包括使用ENGINE = MEMORY。

+0

在你的例子中,你引用了一個名爲THEME的表。我不知道那是什麼,所以我沒有在我的答案中提到它。如果它很重要,請在您的問題中添加詳細信息。 – MJB 2010-06-10 14:03:57

+0

您看到的錯誤有一個簡單的修復,在派生查詢後添加一個名稱。 SELECT recipe_id FROM ... JOIN(SELECT ...)name_it_here USING ... – 2010-06-11 13:17:35

回答

0

有可能有更好的方式來想想它,但我看到的答案是兩套的交集:那些有雞肉的食譜和那些有奶油的食譜。如果您簡化的不僅僅是列數,這可能對您不適用。但我用一些記錄試了一下,似乎很好。

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 
0

我MJB同意;它是兩組的交集。所以我只是得到兩套,看看他們兩個是什麼...

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"); 
0

其他建議是好的,但這是另一種方式。這實際上就像你在查詢中想要做的一樣。雖然我不知道爲什麼你有和「成分」表,當相同的信息(名稱)似乎包含在「uses_ingredient」。

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

我更喜歡你的想法。但兩種方法都不能很好地擴展。例如,如果您想要4種特定成分的所有食譜,則必須更改計數。另外,您不需要選擇計數,只需**計數(星號)= 2 **就足夠了。更好的是,如果你說**('a','b')**中的名字,你可以簡化更多。您可以計算該數組中元素的數量並說明** count(star)= @ nbr **或其他什麼地方。 – MJB 2010-06-11 17:34:11

相關問題