所以我有2张桌子。 1叫做#34;食谱"和一个名为"成分"。在食谱表中我有:id,recipe_name,calories,bld(可以是早餐,午餐和晚餐可以是B,L或D的枚举列表),准备(准备时间)和技能(另一个列表为beg, int和adv)。
在ingredients表中,我有:recipe_id(对配方表中id列的外键约束),ingredient_name和其他一些列。
我试图从配方表中选择所有列和配料表中的ingredient_name comlumn有一些条件 - 我想要返回所有配方,即使它们在配料表中没有配料(这不会真的发生在练习但这对我来说无论如何都要学习),如果他们的一个成分包含用户输入的关键词的一部分(在下一个例子中使用" olive"作为关键词),我想排除食谱
到目前为止,这是我的SQL:
SELECT recipes.*, ingredients.ingredient_name
FROM recipes
LEFT OUTER JOIN ingredients
ON ingredients.recipe_id=recipes.id
WHERE ingredients.ingredient_name <> '%olive%'
ORDER BY RAND() LIMIT 7
这只返回含有食材的食谱,并且仍然包含食谱,其中&#34;橄榄&#34;是其中一个成分名称的一部分。
感谢您的帮助
答案 0 :(得分:1)
在使用这种类型的逻辑时,最好考虑数据集。
设置1 :橄榄在配料中的配方列表:
SELECT recipe_id
FROM ingredients
WHERE ingredient_name LIKE '%olive%'
现在我们有一套我们可以排除的食谱,因为它们中含有橄榄油。
SET 2 :食谱及其成分清单:
SELECT recipes.*, ingredients.ingredient_name
FROM recipes
LEFT OUTER JOIN ingredients
ON ingredients.recipe_id=recipes.id
这里没有惊喜。只是一套一切。我们想要做的是通过上一步中的设置限制此集:
SET 3 :限制SET2设置的SET2:
SELECT recipes.*, ingredients.ingredient_name
FROM recipes
LEFT OUTER JOIN ingredients
ON ingredients.recipe_id=recipes.id
WHERE recipes.id NOT IN
(
SELECT recipe_id
FROM ingredients
WHERE ingredient_name LIKE '%olive%'
)