如何使用MySQL语句实现表的分组合并查询
MySQL 同分组非空字段合并实现方法
针对需求中「按col1分组、每个分组最多2行、将同组非空字段合并为单行」的规则,可直接通过聚合函数实现,无需复杂关联:
实现原理
MySQL 的聚合函数(MAX/MIN)会自动跳过字段值为NULL的记录,同分组下如果某个字段仅存在1个非空值,聚合后会直接返回该值,完全匹配合并需求,且查询性能最优。
可直接执行的SQL
结构化结果查询
返回合并后的标准表结构结果,替换为实际表名即可运行:
SELECT col1, MAX(col2) AS col2, MAX(col3) AS col3 FROM 你的表名 GROUP BY col1;
执行后输出结果:
| col1 | col2 | col3 |
|---|---|---|
| B | C | |
| A | D | E |
带行号的格式化文本输出
如果需要匹配示例中line N: 内容的纯文本格式,根据MySQL版本选择对应语句:
MySQL 8.0+ 版本
SELECT CONCAT( 'line ', ROW_NUMBER() OVER (ORDER BY group_first_id), ': ', col1, IF(col2 IS NULL, ' ', CONCAT(' ', col2, ' ')), IF(col3 IS NULL, ' ', col3) ) AS output_line FROM ( SELECT col1, MIN(id) AS group_first_id, -- 按分组首次出现的行排序,保证输出顺序与原始表一致 MAX(col2) AS col2, MAX(col3) AS col3 FROM 你的表名 GROUP BY col1 ) t;
MySQL 5.x 版本
SELECT CONCAT( 'line ', @rn := @rn + 1, ': ', col1, IF(col2 IS NULL, ' ', CONCAT(' ', col2, ' ')), IF(col3 IS NULL, ' ', col3) ) AS output_line FROM ( SELECT col1, MAX(col2) AS col2, MAX(col3) AS col3 FROM 你的表名 GROUP BY col1 ORDER BY MIN(id) ) t, (SELECT @rn := 0) init;
扩展适配
如果后续同分组同字段可能出现多个非空值,只需将MAX(col字段)替换为GROUP_CONCAT(col字段 SEPARATOR '')即可适配多值拼接场景,整体查询逻辑无需调整。
内容的提问来源于stack exchange,提问作者Walter Schrabmair
相关产品推荐
相关产品推荐

