【问题标题】:Getting unexpected results from SQL query从 SQL 查询中获取意外结果
【发布时间】:2016-04-19 00:31:17
【问题描述】:

所以我有 2 张桌子。一种称为“食谱”,一种称为“成分”。在食谱表中,我有:id、recipe_name、卡路里、bld(一个枚举列表,可以是早餐、午餐和晚餐的 B、L 或 D)、prep(准备时间)和 Skill(另一个枚举列表 beg, int 和 adv)。

在成分表中,我有:recipe_id(对食谱表中的 id 列有外键约束)、成分名称和其他一些列。

我试图在某些条件下从食谱表中选择所有列,并从成分表中选择成分名称列 - 我想返回所有食谱,即使它们在成分表中没有成分(这不会真的发生在练习,但无论如何这是我要学习的),如果其中一种成分包含用户输入的关键字的一部分,我想排除食谱(在下一个示例中将使用“橄榄”作为关键字)。

到目前为止,这是我的 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

这仅返回带有成分的食谱,并且仍然包括其中“橄榄”是成分名称之一的食谱。

感谢您的帮助

【问题讨论】:

  • 您没有正确回答您的问题。您所做的只是从其中包含“%olive%”的成分中删除所有记录。你不〜仅限于具有该成分线的食谱。顺便说一句,“食谱。*”是不好的做法。即使您必须输入更多内容,但您希望的完整列列表是一个更好的约定。

标签: mysql


【解决方案1】:

在使用这种类型的逻辑时,最好考虑数据集。

Set 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:用 SET1 集限制 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%'
   )

【讨论】:

  • 好答案。或者 - WHERE recipes.id NOT IN 可以替换为“SET 3”中的 WHERE NOT EXISTS
  • 非常感谢!现在去测试一下
猜你喜欢
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
相关资源
最近更新 更多