sqlserver 查询是否全部匹配或者匹配个数>=N

我有两张表:

 dt_order_commoditys     订单商品表
 orderID 订单ID  comID   商品ID
 001  1
 001  2
 001  3
002 1
003 1
 003   3 
 dt_commodity2categorys 商品类别中间表。一个商品有多个分类记录
  comID   商品ID   categoryID   分类ID
 1  10
 1 20
 1 30 
 1  2010
 2  2010
 2  3010
 2  8010
 3  10
 3  4010
 3  401010
 3  5010
 3  5020
 3  60

 现在的需求有两种情况。页面上面有一个报表功能,用户选择多个商品分类,比如他选择了三个分类,需要找到全部包含三个分类的订单,或者是选了五个分类,需要找到至少包含三个分类的订单。

  都是通过传入类别ID筛选出订单ID:

  第一种是,我传入 三个类别ID过来,要求筛选出全部包含三个商品类别的订单ID,比如我传类别ID  20、3010、10过来,就筛选出001订单,因为001订单中所有商品类别(就是dt_commodity2categorys所有数据)全包含 20、3010、10。 如果传20、3010、10、9010,那么就没有数据。

  第二种情况是,我传入多个类别ID过来,只要能匹配到2个及以上类别就符合条件。比如我传类别20、3010、1010、9010、4010、8010过来,就筛选出 001订单和003订单,如果传类别20、3010、1010、9010、4020、8010,就只筛选出 001订单。

跪求大佬帮忙看看这种情况怎么解决啊!

回答

SQL如下:

-- 传入:'20','2010','10'  3是传进来的categoryID个数,全匹配
SELECT * FROM dt_commodity2categorys WHERE comID IN (SELECT comID FROM dt_commodity2categorys WHERE categoryID IN ('20','2010','10')
GROUP BY comID HAVING(COUNT(comID))=3)

-- 传入:'20','2010','1010','9010','4010','8010'  2是指定的个数,部分匹配
SELECT * FROM dt_commodity2categorys WHERE comID IN (SELECT comID FROM dt_commodity2categorys WHERE categoryID IN ('20','2010','1010','9010','4010','8010')
GROUP BY comID HAVING(COUNT(comID))>=2)

-- 传入:'20','2010','1010','9010','4010','8020'  2是指定的个数,部分匹配
SELECT * FROM dt_commodity2categorys WHERE comID IN (SELECT comID FROM dt_commodity2categorys WHERE categoryID IN ('20','2010','1010','9010','4010','8020')
GROUP BY comID HAVING(COUNT(comID))>=2)
以上是sqlserver 查询是否全部匹配或者匹配个数>=N的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>