Показать название рецепта, если все его ингредиенты уже даны - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть 3 таблицы с такой структурой:

Рецепт

id |recipe_name

Ингредиенты

id |ингредиенты_имя

Отношения

избавиться |recipe_id |ингридиенты ингридиенты

Пример. Я ищу рецепт с ингредиентами "курица" и "майонез", после чего он отобразит все рецепты с этими двумя ингредиентами.я уже получил код для этого:

SELECT * 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.id

Но я хочу, чтобы, когда в рецепте содержались только курица и майонез в качестве ингредиентов, он отображался в отдельном результате.Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

При добавлении предложения HAVING - например, так:

SELECT * 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

(Примечание: это вернет рецепты, которые только включают курицу и майонез, и никаких других ингредиентов. Чтобы вернуть рецептыкоторые включают в себя как курицу, так и майонез, но могут включать и другие ингредиенты, удалить условие COUNT(DISTINCT case и восстановить условие WHERE.)

1 голос
/ 13 февраля 2012

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

SELECT * 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')
and r.id not in (select r.id 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 not IN ('chicken','mayonnaise'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...