我有一张叫吃饭的桌子。膳食有许多成分(如泥、肉、牛排),每种成分都含有has_many过敏原。
我想选择没有任何给定的过敏原清单的食物。
如果我加入这三个表,并做allergen_id不在(.(过敏原if列表),如果食物中有任何不能排除在寓言中的变应原,它就会退还给我,这是不对的:
select * from meals m
join components c on c.meal_id=c.id
join allergens a on a.component_id=c.id
where a.id not in (1,2,3,4)如果一顿饭有过敏原15和7,它仍将从上述查询返回。我怎么说“把没有下列任何过敏原的所有食物还给我”?
更新澄清示例。
假设我吃了一顿由马什,豌豆和派组成的晚餐。里面有奶制品,派里有面筋。然后我吃了一顿牛排饭,里面有肉过敏原(对素食者没有好处)。
土豆泥,豌豆,派->乳制品,面筋
牛排,薯条,->肉
我想选择没有奶制品的一餐或一餐。结果应该是只吃牛排/薯片。
如果我加入他们所有人:
select * from meals m
join components c on c.meal_id=c.id
join allergens a on a.component_id=c.id这会让我对每一种过敏原都感到厌烦。因此,如果我添加where子句:
select * from meals m
join components c on c.meal_id=c.id
join allergens a on a.component_id=c.id
where a.id not in (2)会有一排面筋,所以麦汁/豌豆/派粉不会被排除在外。我怎么排除它?
发布于 2020-06-22 09:57:57
不存在(.)做你想做的事。
您自己的文本I want to select the meal(s) which doesn't have any of a given list of allergens.几乎可以直接转换为SQL:
-- How do I say:
-- Return me all meals
select * from meals m
where not exists ( -- which doesn't have
select *
from components c -- any of the following allergens
join allergens a on a.component_id = c.id AND a.id in (1,2,3,4)
where c.meal_id = m.id
);https://stackoverflow.com/questions/62511144
复制相似问题