mysql - 从 SQL 查询中获取意外结果

标签 mysql

所以我有两张 table 。 1 个称为“食谱”,一个称为“配料”。在食谱表中,我有:id、recipe_name、卡路里、bld(早餐、午餐和晚餐可以是 B、L 或 D 的枚举列表)、prep(准备时间)和技能(另一个用于乞求的枚举列表, int 和 adv)。

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

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

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

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

感谢您的帮助

最佳答案

在处理此类逻辑时,最好以数据集的形式进行思考。

第 1 组:成分中含有橄榄的食谱列表:

SELECT recipe_id
FROM ingredients
WHERE ingredient_name LIKE '%olive%'

现在我们有一组可以排除的食谱,因为它们含有橄榄。

第 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%'
   )

关于mysql - 从 SQL 查询中获取意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36699190/

相关文章:

php - 如何查询外键并获取对应的行

sql - 可以在 MySQL Group BY 中使用多于 1 列吗?

sql - mysql 中的排名

php - 使用 JOIN 从数据库中检索结果

php - 向程序员寻求帮助

python - SQL 选择所有日期范围内都存在的特定列

mysql - 如何显示整个表的最小值

mysql - INSERT IGNORE - 如何判断是否已插入?

php - SQL 代码执行 : Trending topics equals a twitter

php - 我收到 laravel mysql [2002] 连接错误