Возвращает только рецепты, содержащие все ингредиенты Sql

#sql #database #count #subquery #having-clause

#sql #База данных #количество #подзапрос #having-предложение

Вопрос:

У меня есть эти 3 таблицы:

Напитки

  • drink_id
  • Имя

Ингредиенты

  • ingredient_id
  • Имя

Opskrifter

  • drink_id
  • ingredient_id
  • Количество

Drinks и Ingredients перекрестные ссылки в opskrifter .

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

Запас

  • Имя

Итак, чтобы приготовить джин с тоником, мне нужно иметь в наличии и джин, и тоник.

Если у меня есть только кока-кола и тоник, я ничего не должен возвращать

Это то, что я получил до сих пор, скопировал / вставил из другого сообщения, но не могу продвинуться дальше.

 Select
    d.*
From
    drinks d
Where
    not exists (select 1 
                from opskrifter r 
                where r.drink_id = d.drink_id 
                  and r.ingredient_id in (1, 2, 3))
 

Пожалуйста, помогите 🙂

Ответ №1:

Вы можете использовать агрегацию:

 select o.drink_id
from opskrifter o
where r.ingredient_id in (1, 2, 3)
group by o.drink_id
having count(*) = 3;
 

Вы можете использовать join , in , exists — что угодно — для ввода всей строки из drinks .

Ответ №2:

Я хочу вернуть все рецепты opskrifter , в которых есть ингредиенты из другой таблицы stock .

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

 select o.drink_id
from opskrifter o
inner join stock s on s.ingredient_id = o.ingredient_id
group by o.drink_id
having count(*) = (select count(*) from stock)
 

В качестве альтернативы, если вам нужны напитки, все ингредиенты которых доступны в stock :

 select o.drink_id
from opskrifter o
left join stock s on s.ingredient_id = o.ingredient_id
group by o.drink_id
having count(*) = count(s.ingredient_id)
 

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

1. у меня есть ingredient_id в наличии, но это не работает. он возвращает оба тестовых рецепта, которые у меня есть в opskrifter?

2. @JoachimAhmMortensen: не совсем понятно, о чем вы на самом деле спрашиваете. Я дал два запроса для двух разных целей. Если ни один из двух результатов не дает желаемых результатов, я бы рекомендовал предоставить образцы данных и желаемые результаты из всех связанных таблиц. Например, вы могли бы создать скрипку db .

3. извините.. у меня была ошибка в моей таблице.. Это работает отлично. Спасибо большое 🙂