MySQL如何自动从多个表中选取指定列合并输出
MySQL多表合并查询优化方案
方法1:动态生成SQL(适合临时单次查询)
无需手动拼接每个表的查询语句,通过系统表自动生成完整UNION逻辑:
- 先调整字符串拼接长度限制,避免SQL被截断:
SET SESSION group_concat_max_len = 102400;
- 生成拼接好的查询SQL:
SET @union_sql = NULL; SELECT GROUP_CONCAT( '(SELECT col1,col2,col3,col4 FROM ', table_name, ' ORDER BY col1 DESC LIMIT 1)' SEPARATOR ' UNION ALL ' ) INTO @union_sql FROM information_schema.tables WHERE table_schema = DATABASE() -- 按需调整表筛选规则,以下二选一: -- 规则1:表名有统一前缀时使用 AND table_name LIKE 'table%' -- 规则2:表名无规律时手动指定 -- AND table_name IN ('table1','table2','table3',...,'table26') ;
- 执行生成好的SQL:
PREPARE exec_stmt FROM @union_sql; EXECUTE exec_stmt; DEALLOCATE PREPARE exec_stmt;
方法2:封装为存储过程(适合频繁查询场景)
如果该查询需要经常运行,可以直接封装为存储过程,后续仅需一行代码调用:
DELIMITER // CREATE PROCEDURE QueryAllTableTop1() BEGIN SET SESSION group_concat_max_len = 102400; SET @union_sql = NULL; SELECT GROUP_CONCAT( '(SELECT col1,col2,col3,col4 FROM ', table_name, ' ORDER BY col1 DESC LIMIT 1)' SEPARATOR ' UNION ALL ' ) INTO @union_sql FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE 'table%'; -- 按实际表规则调整 PREPARE exec_stmt FROM @union_sql; EXECUTE exec_stmt; DEALLOCATE PREPARE exec_stmt; END // DELIMITER ;
后续调用只需执行:
CALL QueryAllTableTop1();
- 注意事项:
- 不需要去重时优先用
UNION ALL替换UNION,查询性能更高 - 所有参与查询的表需要保证返回的4个字段的顺序、数据类型完全一致,否则会报错
- 不需要去重时优先用
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

