如何修改MySQL查询 筛选同SKU对应不同子公司的记录
实现方案
你可以选择SQL层直接筛选或者PHP集合层二次处理两种方式实现需求,两种方案都能满足去重、仅保留对应多个子公司的SKU记录的要求。
方案1:调整MySQL查询语句(推荐,性能更优)
核心逻辑是先找出所有关联了≥2个不同subsidiary的product_sku,再关联原查询结果取对应记录,同时做去重。
调整后的SQL语句如下:
SELECT DISTINCT main_table.*, secondTable.* FROM mst_rma_item AS main_table LEFT JOIN mst_rma_rma AS secondTable ON main_table.rma_id = secondTable.rma_id INNER JOIN ( -- 筛选出对应至少2个不同子公司的SKU SELECT t1.product_sku FROM mst_rma_item t1 LEFT JOIN mst_rma_rma t2 ON t1.rma_id = t2.rma_id GROUP BY t1.product_sku HAVING COUNT(DISTINCT t2.subsidiary) >= 2 ) AS valid_sku ON main_table.product_sku = valid_sku.product_sku
语句逻辑说明:
- 子查询部分按
product_sku分组,用COUNT(DISTINCT subsidiary)统计每个SKU对应的不同子公司数量,仅保留数量≥2的SKU - 外层用
INNER JOIN关联有效SKU列表,自动过滤掉只对应单个子公司的SKU(比如示例中的26-MB02) - 加入
DISTINCT关键字自动去除重复条目,解决示例中item_id=1重复出现的问题
方案2:PHP代码层处理现有集合数据
如果不想修改原有SQL,也可以在拿到$collection->getData()的结果后,通过PHP逻辑做二次处理,代码示例如下:
$rawData = $collection->getData(); // 第一步:统计每个SKU对应的不同子公司数量 $skuSubsidiaryMap = []; foreach ($rawData as $item) { $sku = $item['product_sku']; $subsidiary = $item['subsidiary']; $skuSubsidiaryMap[$sku][$subsidiary] = 1; } // 筛选有效SKU:对应子公司数量≥2 $validSkus = []; foreach ($skuSubsidiaryMap as $sku => $subsidiaries) { if (count($subsidiaries) >= 2) { $validSkus[$sku] = 1; } } // 第二步:筛选有效记录+去重 $result = []; $pickedItemIds = []; foreach ($rawData as $item) { // 跳过无效SKU对应的记录 if (!isset($validSkus[$item['product_sku']])) { continue; } // 用item_id做唯一标识去重 if (!isset($pickedItemIds[$item['item_id']])) { $result[] = $item; $pickedItemIds[$item['item_id']] = 1; } } // 最终的$result就是符合要求的结果
处理逻辑说明:
- 第一次遍历统计每个SKU对应的所有不重复子公司,筛选出符合要求的有效SKU
- 第二次遍历过滤掉不属于有效SKU的记录,同时以
item_id为唯一标识去除重复条目
效果验证
使用提供的测试数据验证,两种方案最终输出结果完全匹配预期:
Array ( [0] => Array ( [item_id] => 1 [rma_id] => 1 [product_sku] => 24-MB02 [subsidiary] => CA ) [1] => Array ( [item_id] => 2 [rma_id] => 2 [product_sku] => 24-MB02 [subsidiary] => DE ) )
内容的提问来源于stack exchange,提问作者Devhs
相关产品推荐
相关产品推荐

