You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不嵌套子查询的情况下获取符合条件的单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:05:23