如何在不嵌套子查询的情况下获取符合条件的单条Bundle产品记录
解决方法
方式一:GROUP BY + HAVING 直接筛选去重
这是最贴合需求的方案,无需嵌套子查询,直接通过分组和条件筛选得到唯一的Bundle父商品记录:
SELECT cpe.entity_id AS parent_product_id, cpe.sku AS parent_product_sku FROM catalog_product_entity cpe JOIN catalog_product_bundle_selection cpbs ON cpe.entity_id = cpbs.parent_product_id JOIN product_shipping ps ON cpbs.product_id = ps.product_id -- 若需关联促销表,按需添加JOIN和过滤条件 -- JOIN promotion p ON cpe.entity_id = p.product_id WHERE p.status = 'active' GROUP BY cpe.entity_id, cpe.sku HAVING COUNT(DISTINCT ps.shipping_method) < COUNT(ps.shipping_method)
逻辑说明
COUNT(DISTINCT ps.shipping_method)统计父商品下子商品的唯一配送方式数量COUNT(ps.shipping_method)统计父商品下子商品的总配送方式条目数- 当两个数值不相等时,说明至少有一个配送方式被多个子商品共用,正好满足「子商品至少有一个相同配送方式」的要求
- 按父商品的唯一标识(
entity_id和sku)分组,天然保证每个父商品只返回一条记录
方式二:窗口函数去重(适用于需保留更多字段场景)
如果需要保留子商品的部分信息但仍要父商品唯一,可使用ROW_NUMBER()窗口函数,用CTE替代嵌套子查询,同样符合要求:
WITH bundle_shipping AS ( SELECT cpe.entity_id AS parent_product_id, cpe.sku AS parent_product_sku, ps.shipping_method, ROW_NUMBER() OVER (PARTITION BY cpe.entity_id ORDER BY ps.shipping_method) AS rn FROM catalog_product_entity cpe JOIN catalog_product_bundle_selection cpbs ON cpe.entity_id = cpbs.parent_product_id JOIN product_shipping ps ON cpbs.product_id = ps.product_id GROUP BY cpe.entity_id, cpe.sku, ps.shipping_method HAVING COUNT(*) > 1 ) SELECT parent_product_id, parent_product_sku FROM bundle_shipping WHERE rn = 1
逻辑说明
- 先通过CTE筛选出存在重复配送方式的子商品关联数据,并按父商品分组给每条记录编号
- 取编号为1的记录,确保每个父商品只返回一条
额外提示
- 若
product_shipping中单个子商品对应多个配送方式,需根据业务调整统计逻辑,比如先按子商品聚合配送方式再判断重复 - 关联促销表时,可直接在JOIN后添加过滤条件,无需嵌套子查询
内容的提问来源于stack exchange,提问作者Nugraha. A
相关产品推荐
相关产品推荐

