Элегантный способ определения рецептов, которые я могу приготовить из своих ингредиентов - PullRequest
0 голосов
/ 22 декабря 2018

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

RECIPE
    RID (INT, PK, auto_inc)
    NAME (VARCHAR)

INGREDIENT
    IID (INT, PK, auto_inc)
    NAME (VARCHAR)

RECIPE_INGREDIENT
    RID (INT, FK to RECIPE.RID)
    IID (INT, FK to INGREDIENT.IID)
    AMOUNT (VARCHAR)
    PK: RID, IID

Что я хочу сейчас сделать, так это сказать: «Я не могу обойтись без коктейля x, y и z».Определение ингредиентов, необходимых для создания x, y и z, тривиально.

Но как бы изящно ответить на вопрос: «Если у меня есть ингредиенты, то я 1 , я 2 и я 3 ,какие рецепты я могу сделать? "

Что быстро приходит мне на ум, это процедура, которая перебирает все рецепты и добавляет их в набор, который возвращается в конце, только если нетОтображение rid_iid для него, чей iid отсутствует в данном наборе iids.Но я не являюсь базой данных или SQL-гуру, и сейчас я очень устал, поэтому я думаю, что может быть что-то более изобретательное ...

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете использовать group by и having:

select ri.rid
from recipe_ingredient ri
group by ri.rid
having sum( ri.iid not in (@i1, @i2, @i3 )) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...