结合AND / OR的MySQL多对多条件

时间:2012-08-06 13:49:37

标签: mysql sql many-to-many

我的mysql查询有问题,这是与Mysql join query for multiple "tags" (many-to-many relationship) that matches ALL tags?

相关的复杂问题

所以我有经典的MN表架构:

Item
1 | Item1
2 | Item2
...

Category
1 | Category1
2 | Category2
3 | Category3
4 | Category4
...

Item_has_category
1 | 1
...

问题是 - 如何获取行,其中 Category1 Category2 AND Category3

对于某些复杂的过滤器,某些类别有一个特殊的组,必须与 AND

我想我必须将HAVING与DISTINCT (链接到顶部的其他问题)结合起来,但我不确定如何。

4 个答案:

答案 0 :(得分:3)

group by可行:

select  ItemId
from    Item_has_category
group by
        ItemId
having  sum(case when CategoryId = 1 then 1 end) = 1
        or sum(case when CategoryId = 2 then 1 end) = 1
        andsum(case when CategoryId = 3 then 1 end) = 1 

答案 1 :(得分:0)

select * from Item i
  inner join Item_has_category ic on i.ID = ic.I_ID
  where (ic.C_ID = 1 OR ic.C_ID = 2) AND ic.C_ID = 3

答案 2 :(得分:0)

试试这个::

项目

分类

Item_has_category

Select * from 
itemcategorymapping icm 
inner join item i on (icm.itemID=i.itemId)
inner join category c on (icm.catId=c.catId)
group by icm.itemId having ((icm.catId=CAT1 or icm.catId=Cat2) AND icm.catID=cat3)

答案 3 :(得分:0)

Andomar的回答是非常好的,这对我来说是一个突破。我建议升级版本。使用标签组和/或逻辑是更优雅和通用的方式。 它不需要OR运算符,具有紧凑,可自我解释的视图,并且易于生成语法。

SELECT  ItemId
FROM    Item_has_category
GROUP BY
        ItemId
HAVING      SUM(CASE WHEN CategoryId IN (1,2) THEN 1 END) > 0
        AND SUM(CASE WHEN CategoryId IN (3)   THEN 1 END) > 0
        AND SUM(...