SQL如何根据购物车子商品条件查询匹配的正确BundleId
解决方案
我们要找完全匹配购物车所有商品及对应数量的套餐ID(BundleId),核心逻辑是校验目标套餐绑定的所有商品是否和购物车输入的商品ID、数量完全符合,没有遗漏项。
参考查询SQL
首先我们可以把购物车输入的商品数据作为临时数据集参与查询,示例语句如下:
SELECT bp.BundleId FROM BundleProduct bp -- 关联购物车输入数据 INNER JOIN ( -- 这里是输入的购物车商品:3个葡萄(ProductId=3)、4个橙子(ProductId=2) SELECT 3 AS ProductId, 3 AS Quantity UNION ALL SELECT 2 AS ProductId, 4 AS Quantity ) cart ON bp.ProductId = cart.ProductId AND bp.Quantity = cart.Quantity -- 按BundleId分组统计匹配的商品数 GROUP BY bp.BundleId -- 要求匹配的商品数 = 该Bundle实际绑定的总商品数,确保完全匹配没有遗漏 HAVING COUNT(*) = (SELECT COUNT(*) FROM BundleProduct WHERE BundleId = bp.BundleId)
结果说明
上述语句执行后会返回 2,对应套餐「3 Grape + 4 Orange Get 1 Strawberry」,完全符合输入的购物车商品条件。
逻辑解释
- 内层UNION ALL部分是输入的购物车数据,实际业务中可以根据传入的购物车列表动态拼接生成
- 关联条件同时校验商品ID和数量是否匹配,直接排除数量不满足的套餐
- 最后的HAVING条件排除了只匹配了套餐部分商品的情况,确保套餐绑定的所有商品都在购物车里且数量符合要求
内容的提问来源于stack exchange,提问作者Noor Wachid
相关产品推荐
相关产品推荐

