3

我对 mysql 查询有疑问,这是一个复杂的问题,与匹配所有标签的多个“标签”(多对多关系)的 Mysql 连接查询有关?

所以我有经典的 MN 表模式:

Item
1 | Item1
2 | Item2
...

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

Item_has_category
1 | 1
...

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

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

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

4

4 回答 4

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 
于 2012-08-06T13:54:16.757 回答
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
于 2012-08-06T13:53:44.533 回答
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)
于 2012-08-06T13:56:22.733 回答
0

Andomar 回答的想法非常好,对我来说是突破性的。我建议升级版本。使用标签组 AND/OR 逻辑是一种更优雅、更通用的方式。它不需要 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(...             
于 2015-12-06T06:38:27.547 回答