Я хочу показать рецепт, содержащий данный ингредиент, но имеющий и другие ингредиенты - PullRequest
0 голосов
/ 14 февраля 2012

Относительно моего первого вопроса «Показать название рецепта, если все его ингредиенты уже даны»

Мой первый вопрос спрашивает об отображении рецепта, когда все его ингредиенты выданы, Следующее - это то же самое, что и первый, но оно должно отображать рецепт (с такими ингредиентами, как у первого) и имея также некоторые ингредиенты в состоянии для этого рецепта, чтобы быть завершенным. Извините за мой плохой английский. Я надеюсь, вы знаете, что я имею в виду с этим.

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

Аналогично моему ответу (теперь исправлен) на первый вопрос - здесь должны быть возвращены все рецепты, содержащие все указанных ингредиентов, но также требуют дополнительных ингредиентов:

SELECT r.* from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
GROUP BY r.id
HAVING COUNT(DISTINCT i.ingredients_name)>2 AND
       COUNT(DISTINCT case when i.ingredients_name IN ('chicken','mayonnaise') 
                           then i.ingredients_name end)=2
2 голосов
/ 14 февраля 2012

Чтобы посмотреть список рецептов на основе списка ингредиентов, где рецепт должен содержать эти ингредиенты, но также может иметь больше, вы можете попробовать что-то вроде этого:

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id

INTERSECT

SELECT R.name
FROM Recipe R, Ingredients I, Relationship Rel
WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
   Rel.recipe_id=R.id

Что этоон находит все рецепты, в которых «Цыпленок» является ингредиентом, и пересекает его со всеми рецептами, где «Мейо» является ингредиентом.Это дает вам рецепты, где «Цыпленок» и «Мейо» являются обоими ингредиентами для данного рецепта.


Если подумать, в MySQL нет ключевого слова INTERSECT.В таком случае попробуйте это:

SELECT DISTINCT R.name FROM Recipe R
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Chicken' AND Rel.ingredients_id = I.id AND 
              Rel.recipe_id=R.id) as recipeA
INNER JOIN (SELECT R.name
            FROM Recipe R, Ingredients I, Relationship Rel
            WHERE I.ingredients_name = 'Mayo' AND Rel.ingredients_id = I.id AND 
               Rel.recipe_id=R.id) as recipeB
1 голос
/ 14 февраля 2012

Я думаю, что simchona может быть чем-то хорошим, но вам, очевидно, придется генерировать код в цикле, который делает предложение выбора для каждого ингредиента.

Еще один способ, которым некоторые люди решают подобные проблемы, состоит в том, чтобы объединить столбец в одну строку и проверить ее. Я думаю, что есть и плюсы и минусы в обоих направлениях, как в отношении производительности, так и в плане удобства обслуживания. Хорошее место для начала, чтобы решить, как объединить строки, если вы хотите изучить этот метод: SQL /

Другим вариантом будет создание хранимой процедуры и использование некоторого TSQL в цикле для составления списка совпадающих элементов ... определенно последний вариант, который я обычно выбираю, но в зависимости от того, насколько вам нужна производительность, это может быть жизнеспособный маршрут, чтобы принять.

0 голосов
/ 14 февраля 2012

я думаю, что следующий запрос выполнит требование:

SELECT r.recipe_name from recipe r
INNER JOIN relationship ri on r.id=ri.recipe_id
INNER JOIN ingredients i on i.id=ri.ingredients_id
where i.ingredients_name IN ('chicken','mayonnaise')
GROUP BY r.recipe_name
HAVING COUNT(i.ingredients_name) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...