У меня есть две таблицы 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' )
)
Я уверен, что должен быть относительно простой способ сделать это, но это не щелчок.
РЕДАКТИРОВАТЬ: Я фактически закончил с измененной версией ответа ниже:
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
указан, он даже не появится в списке для сортировки, поэтому будет исключен.