Mam dwa stoły SQLite, przepisy i składniki. Muszę znaleźć wszystkie przepisy zawierające od 2 do 4 pozycji z listy składników, ale nie mogę pojąć SQL, aby to zadziałało.

Tabele to:

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

Zacząłem od czegoś prostego, ale zabrakło mi pary, kiedy doszedłem do części „między n i n składnikami”.

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

Jestem pewien, że musi być na to stosunkowo prosty sposób, ale nie jest to klikanie.

EDYTUJ: W rzeczywistości uzyskałem zmodyfikowaną wersję poniższej odpowiedzi:

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

W przeciwieństwie do oryginalnej odpowiedzi, jeśli przepis nie pasuje do żadnych składników, a podany jest BETWEEN 0 AND 2, nie pojawi się on nawet na liście do sortowania, więc zostanie wykluczony.

0
Echilon 1 marzec 2012, 00:08

3 odpowiedzi

Najlepsza odpowiedź
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
3
Michael Fredrickson 1 marzec 2012, 00:11
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
1
Sam DeHaan 1 marzec 2012, 00:13

Po prostu kolejna odmiana tego samego:

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
)
0
J Cooper 1 marzec 2012, 00:29