MySQL查询全表数据按serial字段分组组织关联行的实现方法
问题原因
你之前使用的GROUP BY是MySQL的聚合语法,作用是将同serial的多条记录合并为单条记录用于计数、求和等聚合计算,自然无法得到需要的分层展示结果。
实现方案
方案1:SQL层直接生成格式化结果(推荐MySQL 8.0及以上版本)
利用窗口函数给同分组内的行做编号,首行输出分组字段值,其余行输出缩进后的拼接内容:
WITH ranked_data AS ( SELECT serial, vehicule, alert_emails, -- 按serial分组,给组内每行生成序号 ROW_NUMBER() OVER (PARTITION BY serial ORDER BY vehicule) AS group_row_num FROM mytable ) SELECT CASE WHEN group_row_num = 1 THEN CAST(serial AS CHAR) ELSE CONCAT(' ', vehicule, '|', alert_emails) END AS format_result FROM ranked_data ORDER BY serial, group_row_num;
输出结果完全匹配你需要的层级结构。
方案2:兼容MySQL 5.x版本实现
如果使用不支持窗口函数的低版本MySQL,可以用用户变量实现相同逻辑:
SELECT CASE WHEN @last_serial != serial THEN CAST((@last_serial := serial) AS CHAR) ELSE CONCAT(' ', vehicule, '|', alert_emails) END AS format_result FROM mytable, (SELECT @last_serial := -1) AS init_var ORDER BY serial, vehicule;
方案3:应用层处理(更推荐)
如果不要求必须在SQL侧完成格式拼接,更建议先查询所有按serial排序的原始数据:
SELECT serial, vehicule, alert_emails FROM mytable ORDER BY serial, vehicule;
再在业务代码中遍历结果集,判断serial是否变化,自行拼接缩进格式,这种方式灵活度更高,后续调整格式也无需修改SQL。
内容的提问来源于stack exchange,提问作者Dev Dev
相关产品推荐
相关产品推荐

