sql - 查找仅包含纯素产品的所有食谱
问题描述
我一直试图找到所有纯素食产品的食谱,但到目前为止我只有这个:
SELECT DISTINCT r.*
FROM recipes r INNER JOIN recipe_product rp ON r.id = rp.recipe_id
INNER JOIN products p ON rp.product_id = p.id
INNER JOIN product_specificdiet ps ON p.id = ps.product_id
INNER JOIN specificdiets sd ON ps.specific_diet_id = sd.id
WHERE sd.type = 'VEGAN';
但这个查询给了我所有食谱的素食产品。
不知道我该如何解决。
谢谢!
解决方案
两条规则:
- 如果产品的特定饮食之一是“素食主义者”,则该产品是素食主义者。
- 一个食谱是纯素的,如果它只包含纯素产品。
换句话说:纯素食谱是NOT EXISTS
任何产品都是NOT IN
纯素产品的食谱。
select *
from recipes r
where not exists
(
select null -- non-vegan ingredient
from recipe_product rp
where rp.recipe_id = r.id
and rp.product_id not in
(
select ps.product_id -- vegan product
from product_specificdiet ps
join specificdiets sd ON ps.specific_diet_id = sd.id
where sd.type = 'VEGAN'
)
);
推荐阅读
- java - Hibernate and Inheritance - 需要增加一列(Spring Boot)
- python - Linux wifi 提取脚本
- javascript - https 和 wss 在本地 ip 地址中运行
- esp32 - ESP32 IDF Ble Gatt 服务器示例
- arrays - int (*x)[n] = (int (*)[n]) _x 是什么意思?
- graphql - Apollo GraphQL“writeQuery”导致重新渲染到应用程序,从而导致不必要的网络请求
- c++ - MPI_File_write_at :两次写入相同的结构会导致二进制文件中的数据块略有不同
- sql - 仅在事务完成后强制执行数据完整性
- youtube - 有没有办法在 discord.js 中获取链接到用户的 youtube 频道的 ID?
- javascript - 使用filesInput再次执行事件时如何重新生成DIV?