SQL关联sales_flat_order与sales_flat_order_item表时合并同订单SKU为单条记录
解决方案
基于Magento订单表的MySQL环境,实现单订单单条聚合记录、同单商品按指定格式拼接的需求,直接使用GROUP_CONCAT()聚合函数配合分组查询即可实现,匹配你要求的数量xSKU, 数量xSKU商品字段格式。
核心调整逻辑
- 单条商品记录先拼接为
{购买数量}x{SKU}的格式,和示例展示规则对齐 - 用
GROUP_CONCAT()将同一订单下的所有商品字符串用,(逗号+空格)作为分隔符合并为单个字符串 - 所有订单级别的非聚合字段加入
GROUP BY分组条件,保证每个订单仅返回1条结果 - 可选过滤:如果库中存在可配置商品的父级占位SKU,可新增
SFOI.parent_id IS NULL条件,避免拼接出无效SKU
可直接运行的SQL代码
-- 若订单商品数量较多,可先执行该语句调整当前会话的字符串拼接长度上限,避免内容截断 SET SESSION group_concat_max_len = 10240; SELECT YEAR(SFA.created_at) AS `YEAR`, SFA.increment_id AS SIPNO, CONCAT(SUBSTR(SFA.increment_id, 4, 7), REPLACE(RIGHT(SFA.created_at, 4), ':', '')) AS MOK, GROUP_CONCAT(CONCAT(SFOI.qty_ordered, 'x', SFOI.sku) SEPARATOR ', ') AS UrunKod, SFA.shipping_description AS KARGO, CONVERT_TZ(SFA.created_at, '+00:00','+03:00') AS SIPTARIH FROM sales_flat_order SFA INNER JOIN sales_flat_order_item SFOI ON SFA.entity_id = SFOI.order_id WHERE SFA.`status` = 'complete' AND SFA.increment_id = '400241866' AND YEAR(SFA.created_at) >= 2022 -- 可配置商品场景下取消下方注释,过滤父级占位SKU -- AND SFOI.parent_id IS NULL GROUP BY SFA.entity_id, YEAR(SFA.created_at), SFA.increment_id, MOK, SFA.shipping_description, SIPTARIH;
效果说明
执行后返回结果和你给出的预期结构完全一致:单订单仅返回1条记录,UrunKod字段自动拼接该订单下所有商品信息,无需额外做二次数据处理。
注意:MySQL默认的
GROUP_CONCAT拼接长度上限为1024字节,SKU较长或单订单商品数超过20个时大概率出现内容截断,执行查询前先运行长度调整语句即可规避该问题。
内容的提问来源于stack exchange,提问作者omerkarakaya
相关产品推荐
相关产品推荐

