作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
默认 IN 使用 OR 基本逻辑。有没有办法在范围内使用 AND 基本逻辑。
例如下面的查询
SELECT ItemId,CategoryID
FROM ItemCategories
WHERE CategoryID IN (4,5)
一个项目可以有多个类别。考虑以下子集作为项目
|ItemID | CategoryID |
| 1 | 4 |
| 1 | 5 |
| 2 | 4 |
| 2 | 6 |
| 3 | 4 |
| 3 | 5 |
有什么办法可以排除 item2 吗?由于项目 2 的类别为 6。我想要的项目必须同时包含 4 和 5。
使用 IN 子句在这里没有帮助。 4,5 范围也是动态的。
最佳答案
除了使用 IN ()
仅限制行集,您需要验证 DISTINCT
一套CategoryID
每ItemID
。要确保某个项目同时存在于两个类别中,请验证其聚合 COUNT()
是 2(等于 IN ()
中的项目数)。
SELECT
ItemID
FROM ItemCategories
WHERE CategoryID IN (4,5)
GROUP BY ItemID
-- When there are exactly 2 distinct categories
-- you can be certain that they are the 2 requested in the
-- IN () clause
-- The value here must be equal to the number of items in the IN ()
HAVING COUNT(DISTINCT CategoryID) = 2
这是一个演示:http://sqlfiddle.com/#!6/c9b6c/1
注意:这将提供与您的 IN ()
完全相同的集合。条款,没有别的。如果您需要包括那些可能有其他类别但不在 IN ()
中的类别,只需将其更改为 >=
而不是=
在 HAVING
.
HAVING COUNT(DISTINCT CategoryID) >= 2
关于SQL IN 子句中包含 AND 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984953/
我是一名优秀的程序员,十分优秀!