Объединение трех таблиц, запрос не работает должным образом в SQLite

#android #sqlite

#Android #sqlite

Вопрос:

Я создаю приложение, которое ищет рецепты по ингредиентам. У меня есть 5 таблиц:

Рецепт

 RecipeId | RecipeTitle | Directions | PrepTime | CookTime
  

Ингредиент

 IngredientId | IngredientName
  

Категория

 CategoryId | CategoryName
  

Таблица соединений RecipeIngredient (многие ко многим)

 RecipeId | IngredientId | Quantity | UOM | Comments
  

Таблица соединений RecipeCategory (многие ко многим)

 RecipeId | CategoryId
  

То, что я хочу сделать, это позволить пользователю выбирать ингредиенты, категории и время, и приложение будет искать рецепты, соответствующие вводу пользователя. Я тестирую, как это будет работать, используя DB Browser для SQLite, прежде чем внедрять его в мое приложение, но оно работает не так, как ожидалось.

Вот последний запрос, который я пробовал (конечно, я предполагаю, что здесь вводится пользователем, и они не ограничены количеством ингредиентов и категорий, которые они могут выбрать):

 SELECT RecipeTitle, COUNT(RecipeTitle) AS Ing FROM Recipe

JOIN RecipeIngredient ON Recipe.RecipeId = RecipeIngredient.RecipeId
JOIN RecipeCategory ON Recipe.RecipeId = RecipeCategory.RecipeId

WHERE
    RecipeIngredient.IngredientId = 
    (SELECT Ingredient.IngredientId FROM Ingredient
    WHERE Ingredient.IngredientName = "olive oil")
OR
    RecipeIngredient.IngredientId = 
    (SELECT Ingredient.IngredientId FROM Ingredient
    WHERE Ingredient.IngredientName = "beef")
OR
    RecipeIngredient.IngredientId = 
    (SELECT Ingredient.IngredientId FROM Ingredient
    WHERE Ingredient.IngredientName = "parsley")
AND
    RecipeCategory.CategoryId = 
    (SELECT Category.CategoryId FROM Category
    WHERE Category.CategoryName = "Dinner")
AND
    Recipe.PrepTime   Recipe.CookTime < 35 -- In minutes

GROUP BY RecipeTitle
ORDER BY Ing DESC -- Orders results by recipes that have the most out of the ingredients the user chose, with less relevant recipes at the bottom
  

Вот проблемы, с которыми я сталкиваюсь:

  • Я хочу COUNT(RecipeTitle) подсчитать, сколько выбранных ингредиентов содержится в каждом рецепте в результатах, но вместо этого он также учитывает категорию.
  • Поиск по категориям и времени не работает. Он действительно отображает рецепты, содержащие выбранные ингредиенты, но также отображает те, которые не Dinner содержат и требуют общего времени 35 минут или более.

Ответ №1:

Попробуйте

 SELECT RecipeTitle, COUNT(Ingredient.IngredientId) AS Ing 
FROM Recipe
JOIN RecipeIngredient ON Recipe.RecipeId = RecipeIngredient.RecipeId
JOIN RecipeCategory ON Recipe.RecipeId = RecipeCategory.RecipeId
JOIN Ingredient ON RecipeIngredient.IngredientId = Ingredient.IngredientId 
JOIN Category ON CategoryCategoryId = RecipeCategory.CategoryId
WHERE Ingredient.IngredientName IN ('olive oil', 'beef', 'parsley')
AND Category.CategoryName = 'Dinner'
AND (Recipe.PrepTime   Recipe.CookTime) < 35
GROUP BY RecipeTitle
ORDER BY Ing DESC
  

Комментарии:

1. Он сообщал мне, что такого столбца нет Category.CategoryName , но затем я присоединился к Category таблице, и теперь он работает! Спасибо. Однако у меня есть вопрос. Можно ли объединить 4 таблицы? Это хорошая практика?

2. Хорошо, спасибо за помощь. Тогда я тоже должен присоединиться к таблице категорий, как я это сделал, верно?

3. Да, я просто забыл его добавить. Обновил его сейчас.