默认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范围也是动态的。
答案 0 :(得分:6)
除了使用IN ()
仅限制行集外,您还需要验证每DISTINCT
CategoryID
ItemID
套COUNT()
。要确保两个类别中都有商品,请验证其汇总IN ()
是否为2(等于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
中的商品数量)。
IN ()
以下是演示:http://sqlfiddle.com/#!6/c9b6c/1
注意:这将提供与<{1}}子句的完全的集合,而不提供任何其他内容。如果您需要包含可能不在IN ()
中的其他类别的内容,请在>=
中将其更改为=
而不是HAVING
。
HAVING COUNT(DISTINCT CategoryID) >= 2
答案 1 :(得分:1)
一种令人费解的方式是
select itemid
from (
select itemid, count(distinct categoryid) c
from ItemCategories
where categoryid in (4,5)
group by itemid) a
where a.c = 2
这是另一种令人费解的方式:
select itemid, group_concat(distinct categoryid) g
from ItemCategories
group by itemid
having find_in_set(4,g) and find_in_set(5,g);
如果这是你所谈论的范围:
select itemid
from (
select itemid, count(distinct categoryid) c
from ItemCategories
where categoryid between 4 and 9
group by itemid) a
where a.c = 9-4+1;