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
相关产品推荐
相关产品推荐

