MYSQL中如何将不同行的多列数据合并到同一个查询结果中
解决方案
核心实现逻辑
你的需求属于典型的多行转单行多字段的行转列场景,不需要使用串行IF判断或者多次LEFT JOIN,通过单次关联+条件聚合即可实现,同时能完全避免冗余数据问题。
具体实现步骤
- 单次关联目标表,避免笛卡尔积
不要多次LEFT JOIN同一张/多张表,单次关联所有需要取数的表即可,多次关联会导致结果行数相乘,是你之前产生20条冗余数据的核心原因。 - 用条件聚合提取每个条件对应的字段值
在SELECT子句中通过CASE WHEN匹配每行对应的条件,外层套MAX()/MIN()聚合函数,同一分组下仅会有一行满足对应条件,聚合后会直接返回目标值,不满足条件的行返回的NULL会被聚合函数自动忽略。
示例代码
假设主表为main_table,你需要以id=5的行作为基准,从关联表sub_table中提取4个不同条件对应的字段值,参考写法如下:
SELECT -- 保留主表基准字段 m.id, m.baseline_field1, m.baseline_field2, -- 按条件提取对应字段,聚合为单行多列 MAX(CASE WHEN s.condition_tag = 1 THEN s.target_field END) AS custom_col1, MAX(CASE WHEN s.condition_tag = 2 THEN s.target_field END) AS custom_col2, MAX(CASE WHEN s.condition_tag = 3 THEN s.target_field END) AS custom_col3, MAX(CASE WHEN s.condition_tag = 4 THEN s.target_field END) AS custom_col4 FROM main_table m -- 仅单次关联从表 LEFT JOIN sub_table s ON m.id = s.main_id WHERE m.id = 5 -- 按主表唯一标识分组,将4行从表结果聚合为单行 GROUP BY m.id, m.baseline_field1, m.baseline_field2;
场景适配说明
- 如果4条数据来自不同的表,只需要把对应表的关联逻辑加到LEFT JOIN部分,同样用条件聚合规则提取对应字段即可,无需单独关联后再合并结果。
- 如果你使用支持CTE语法的数据库(MySQL8.0+、PostgreSQL、SQL Server等),也可以先通过CTE预处理好4行目标数据,再执行聚合操作,逻辑可读性会更高。
内容的提问来源于stack exchange,提问作者user15425589
相关产品推荐
相关产品推荐

