You need to enable JavaScript to run this app. MySQL查询实现:同ID不同属性值多行结果按id合并为单行并排展示
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询实现:同ID不同属性值多行结果按id合并为单行并排展示

库存属性多行合并单行实现方案

你提到的基于id做自关联合并的逻辑是可以实现的,但更简单、性能更好的方案不需要做自关联——这类场景是MySQL中非常典型的静态行转列需求,通过条件聚合即可完成多行合并,直接得到你期望的输出结构。

实现逻辑

原有查询因为关联了库存属性关联表、属性表、属性值表,每个库存对应的多组属性会被拆成独立行。实现合并的核心是:按库存的固定维度字段(i.id、i.title、i.product_id)做分组,将原本逐行展示的属性值,通过条件判断转化为独立列的取值,最终相同id的多行记录会自动合并为单行。

可直接复用的查询语句

SELECT 
  i.id, 
  i.title, 
  i.product_id,
  -- 匹配对应属性名取属性值,不匹配的行该列返回NULL
  MAX(CASE WHEN a.name = 'Color' THEN av.value END) AS Color,
  MAX(CASE WHEN a.name = 'Size' THEN av.value END) AS Size
FROM inventories as i 
LEFT JOIN products as p on i.product_id = p.id 
LEFT JOIN attribute_inventory as ai on ai.inventory_id = i.id 
LEFT JOIN attribute_values as av on av.id = ai.attribute_value_id
LEFT JOIN attributes as a on a.id = ai.attribute_id
WHERE i.id = 974
GROUP BY i.id, i.title, i.product_id

补充说明

  • 语句中使用MAX()是为了兼容MySQL的严格分组校验模式,每个分组下对应属性列仅存在一个有效非空值,聚合操作不会改动最终的取值结果
  • 原有查询中的DISTINCT关键字可以直接移除,分组逻辑本身已经能实现去重、合并的效果
  • 如果后续需要支持更多固定属性维度(比如材质、重量等),只需要在SELECT部分按照相同的MAX(CASE WHEN ...)格式追加对应列即可,不需要修改表关联和分组逻辑
  • 如果属性列表完全动态、无法提前预知,就需要通过存储过程查询属性表的枚举值后动态拼接SQL生成对应列,常规固定属性场景下直接使用上面的静态语句即可

内容的提问来源于stack exchange,提问作者Chinnu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 22:54:05