我的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 (链接到顶部的其他问题)结合起来,但我不确定如何。
答案 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(...