3

mysql クエリに問題があります。すべてのタグに一致する複数の「タグ」(多対多の関係) の Mysql 結合クエリに関連する複雑な問題ですか?

だから私は古典的なMNテーブルスキーマを持っています:

Item
1 | Item1
2 | Item2
...

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

Item_has_category
1 | 1
...

そして質問は -項目Category1 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 に答える