2012-02-29 15 views
0

私は2つのSQLiteテーブル、レシピ、および成分を持っています。私は原料のリストから2と4の間のレシピをすべて見つけ出す必要がありますが、私はこの仕事をするために私の頭の中で私の頭を得ることはできません。リンクされた範囲のSQL項目

テーブルは以下のとおりです。

CREATE TABLE recipes (
    rowidx INTEGER AUTOINCREMENT, 
    RecipeID TEXT(10) NOT NULL PRIMARY KEY, 
    Name TEXT(255) NOT NULL 
); 

CREATE TABLE Ingredients (
    Recipe TEXT(10) NOT NULL PRIMARY KEY, 
    Ingredient TEXT(255) NOT NULL COLLATE NOCASE, 
    Measurement TEXT(255) NOT NULL 
); 

私は、単純な何かを始めたが、私は「の間のnとn食材」の部分に来たときに蒸気を使い果たしました。

SELECT COUNT(*) FROM Recipes 
WHERE RecipeID IN (
    SELECT Recipe FROM Ingredients WHERE Ingredient IN (milk','butter','sugar','flour','egg') 
) 

これは比較的簡単な方法で行う必要がありますが、クリックしていないと確信しています。

EDIT:私は実際には以下の回答の修正版になってしまった:オリジナルの答えとは異なり

SELECT *,ifnull((SELECT COUNT(i.Ingredient) AS IngredientCount FROM Recipes r LEFT JOIN Ingredients i ON r.RecipeID = i.Recipe WHERE i.Ingredient IN ('flour') and r.recipeid = allrecipes.recipeid GROUP BY R.RecipeID),0) AS IngredientCount 
FROM Recipes allrecipes 
WHERE IngredientCount BETWEEN 2 AND 4 

レシピは何の成分と一致していない、とBETWEEN 0 AND 2が指定されている場合は、それもしませんソートのためにリストに表示されるので、除外されます。

答えて

3
SELECT 
    r.Name, 
    COUNT(i.Ingredient) AS Ingredients 
FROM 
    recipes r 
    LEFT JOIN ingredients i 
     ON i.Recipe = r.RecipeID 
     AND i.Ingredient IN ('milk','butter','sugar','flour','egg') 
GROUP BY r.Name 
HAVING COUNT(i.Ingredient) BETWEEN 2 AND 4 
+0

優れた、ありがとう。私は常にHAVING節を使用しません。 – Echilon

1
SELECT r.* FROM Recipes r 
JOIN Ingredients i 
    ON r.RecipeID = i.Recipe 
WHERE i.Ingredient IN ('milk','butter','sugar','flour','egg') 
GROUP BY r.RecipeID 
HAVING COUNT(*) BETWEEN 2 AND 4 
0

同じ事のちょうど別のバリエーション:

SELECT R.* 
FROM recipes AS R 
WHERE EXISTS(
    SELECT 0 
    FROM Ingredients AS I 
    WHERE I.Recipe = R.recipeID 
     AND I.Ingredient IN ('milk','butter','sugar','flour','egg') 
    GROUP BY I.Recipe 
    HAVING COUNT(I.Ingredient) BETWEEN 2 AND 4 
) 
関連する問題