Элементы SQL в связанном диапазоне - PullRequest
0 голосов
/ 01 марта 2012

У меня есть две таблицы 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 указан, он даже не появится в списке для сортировки, поэтому будет исключен.

Ответы [ 3 ]

3 голосов
/ 01 марта 2012
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
1 голос
/ 01 марта 2012
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 голосов
/ 01 марта 2012

Просто еще один вариант того же:

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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...