从SQL查询中获得意外结果

时间:2016-04-18 16:11:33

标签: mysql

所以我有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;是其中一个成分名称的一部分。

感谢您的帮助

1 个答案:

答案 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%'
   )