我有两张表:
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)
你好,大佬。
可能我之前描述的不够明确,导致你理解错意思了。
就是我页面上面有一个报表功能,用户选择多个商品分类,比如他选择了三个分类,需要找到全部包含三个分类的订单,或者是选了五个分类,需要找到至少包含三个分类的订单。
我根据大佬提供的语句进行执行,找出来的是商品,但是没办法归整到订单那边去。
@尾随前行: 你是要找订单吗?如果是,外层SQL
中把dt_commodity2categorys
表换成dt_order_commoditys
表查
@三人乐乐: 不对的哥,你sql中是按comID分组和出现次数来筛选的,我是想要以每个订单为一组来匹配分类ID数量的。 不知道我这样说表达的清楚不