带和不带的 SQL 查询

Posted

技术标签:

【中文标题】带和不带的 SQL 查询【英文标题】:SQL Query With & Without 【发布时间】:2014-08-01 13:04:23 【问题描述】:

我有两张表如下:

表格:食谱

字段:recipe_IDtitle


表格:recipe_ingredient

字段:recipe_IDingredient_ID


我想只显示包含某些成分的食谱(我设法做到了那部分),但我也想排除包含某些成分的食谱。

到目前为止,我设法完成了这个查询,它正在工作,但它只显示包含某些成分的食谱。

SELECT DISTINCT r.recipe_ID, r.title 
FROM recipe r 
JOIN recipe_ingredient ri ON (ri.recipe_ID = r.recipe_ID)
WHERE ri.ingredient_ID IN (4, 7) 
GROUP BY r.recipe_ID 
HAVING COUNT(ri.ingredient_ID) = 2

如何使包含某些成分的食谱也排除在外? 我尝试了一些方法,但都失败了。

注意:出于演示目的,4、7 和 Count 值是静态的。

请询问您是否需要更多信息或任何东西。

非常感谢!

【问题讨论】:

所以你想要一些不在数组中的成分? 据我了解,您想要的是所有包含某些成分(A 组)但没有其他成分(B 组)的食谱的列表。现在集合 A 可能是子集/超集或完全差异集? 我想要一份清单,其中包含一些包含某些成分但没有其他成分的食谱。因为例如,你不喜欢苹果,所以你想要没有苹果的食谱。但现在没关系,我相信我已经收到了一个很好的答案。谢谢大家的关注。 forums.mysql.com/read.php?10,507748,507839#msg-507839 【参考方案1】:

您可以使用子查询获取任何包含您想要的成分的recipe_ID,然后在主查询中排除那些recipe_IDs:

SELECT r.recipe_ID, r.title 
FROM recipe r 
JOIN recipe_ingredient ri ON ri.recipe_ID = r.recipe_ID
WHERE ri.ingredient_ID IN (4, 7) 
AND r.recipe_ID NOT IN 
(
  SELECT rs.recipe_ID
  FROM recipe rs
  JOIN recipe_ingredient ris ON ris.recipe_ID = rs.recipe_ID
  WHERE ris.ingredient_ID IN (8, 2) 
)
GROUP BY r.recipe_ID 
HAVING COUNT(ri.ingredient_ID) = 2

【讨论】:

什么都没有,因为 OP 有它,所以我只是离开了它。可以删除【参考方案2】:

您可以只重写查询的这一部分。

   WHERE ri.ingredient_ID not in (4,7)

我相信这就是您要查找的内容,因为您说您的查询返回仅包含某些成分的食谱。

【讨论】:

我希望它在同一个查询中显示具有某些成分的食谱,并排除具有某些其他成分的食谱。我试图将你的 SQL 添加到我的,但它什么也没显示,没有错误。谢谢。【参考方案3】:
SELECT receipe.*
FROM receipe

-- ingredients required
JOIN recipe_ingredient AS ingredient4
    ON ingredient4.recipe_ID = receipe.recipe_ID
    AND ingredient_ID = 4
JOIN recipe_ingredient AS ingredient7
    ON ingredient7.recipe_ID = receipe.recipe_ID
    AND ingredient_ID = 7
-- join again to add more required ingredients

-- ingredients excluded
LEFT JOIN recipe_ingredient AS ingredient9
    ON ingredient9.recipe_ID = receipe.recipe_ID
    AND ingredient_ID = 9
LEFT JOIN recipe_ingredient AS ingredient12
    ON ingredient12.recipe_ID = receipe.recipe_ID
    AND ingredient_ID = 12
-- left join again to add more excluded ingredients

WHERE
    ingredient9.ingredient_ID IS NULL
    AND ingredient12.ingredient_ID IS NULL
    -- add one "IS NULL" condition for each additional ingredient to exclude

【讨论】:

嗯 - 这可能有点乏味:-( @Strawberry 确实很乏味,但likely to run faster。通常会生成此类查询,因此在大多数情况下使用此表单应该很轻松。

以上是关于带和不带的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 只读属性,带和不带 getter

带和不带 FILTER 的 DAX 计算函数

带和不带 () 的条件运算符

带和不带 lambda 的 pandas apply()

带和不带引号和括号的 setTimeout 之间的区别

在 Hive 中处理带和不带双引号的数据