#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. извините.. у меня была ошибка в моей таблице.. Это работает отлично. Спасибо большое 🙂