You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何自动从多个表中选取指定列合并输出

MySQL多表合并查询优化方案

方法1:动态生成SQL(适合临时单次查询)

无需手动拼接每个表的查询语句,通过系统表自动生成完整UNION逻辑:

  1. 先调整字符串拼接长度限制,避免SQL被截断:
SET SESSION group_concat_max_len = 102400;
  1. 生成拼接好的查询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')
;
  1. 执行生成好的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:36:04