带和不带的 SQL 查询
Posted
技术标签:
【中文标题】带和不带的 SQL 查询【英文标题】:SQL Query With & Without 【发布时间】:2014-08-01 13:04:23 【问题描述】:我有两张表如下:
表格:食谱
字段:recipe_ID、title
表格:recipe_ingredient
字段:recipe_ID、ingredient_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_ID
s:
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 查询的主要内容,如果未能解决你的问题,请参考以下文章