#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. Да, я просто забыл его добавить. Обновил его сейчас.