mysql - 批量将别名应用到 MYSQL 中的表列

标签 mysql sql inner-join alias

我正在使用第 3 方 MYSQL 数据库,除了可以读取之外,我无法控制该数据库。它包含 51 个具有相同列结构但名称略有不同的表。他们保存不同数据源的每日摘要。示例表:

CREATE TABLE `archive_day_?????` (
  `dateTime` int(11) NOT NULL,
  `min` double DEFAULT NULL,
  `mintime` int(11) DEFAULT NULL,
  `max` double DEFAULT NULL,
  `maxtime` int(11) DEFAULT NULL,
  `sum` double DEFAULT NULL,
  `count` int(11) DEFAULT NULL,
  `wsum` double DEFAULT NULL,
  `sumtime` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

哪里????更改以指示所保存的数据类型。

自系统运行以来,日期时间字段在每天的午夜在所有表中进行镜像。

我想使用日期时间上的内部联接来生成跨所有表的单个数据集。但要避免写

SELECT ad1.maxtime as ad1_maxtime, ad2.maxtime as ad2_maxtime... 

9 个字段 51 次,有没有办法批量创建别名,例如

ad1.* as ad_*, ad2.* as ad_* and so on.

我看过Create Aliases In Bulk?但这似乎不适用于MySQL。最终数据由 Django ORM 使用。

编辑:不幸的是,Union 不能唯一地标识字段或将它们分组在一起,例如

SELECT * FROM `archive_day_ET` UNION ALL SELECT * FROM `archive_day_inTemp`

结果:

Sample Union Results

最佳答案

要生成包含这些表中所有字段名称的字符串,您可以查询 information_schema.columns

例如:

SELECT 
 GROUP_CONCAT(CONCAT(TABLE_NAME,'.`',column_name,'` AS `',column_name,'_',replace(TABLE_NAME,'archive_day_',''),'`') SEPARATOR ',\r\n')
FROM information_schema.columns
WHERE TABLE_NAME like 'archive_day_%'

db<>fiddle here 进行测试

要生成 JOIN,您可以使用 information_schema.tables

例如:

SELECT CONCAT('FROM (\r\n ',GROUP_CONCAT(CONCAT('SELECT `dateTime` FROM ',TABLE_NAME) SEPARATOR '\r\n UNION\r\n '),'\r\n) AS dt \r\nLEFT JOIN ',
 GROUP_CONCAT(CONCAT(TABLE_NAME,' ON ',
 TABLE_NAME,'.`dateTime` = dt.`dateTime`') SEPARATOR '\r\nLEFT JOIN ')) as SqlJoins
FROM information_schema.tables
WHERE TABLE_NAME like 'archive_day_%'

db<>fiddle here 进行测试

对于他们将生成的 2 个示例表

archive_day_ET.`dateTime` AS `dateTime_ET`, 
archive_day_ET.`min` AS `min_ET`, 
archive_day_ET.`mintime` AS `mintime_ET`, 
archive_day_ET.`max` AS `max_ET`, 
archive_day_ET.`maxtime` AS `maxtime_ET`, 
archive_day_ET.`sum` AS `sum_ET`, 
archive_day_ET.`count` AS `count_ET`, 
archive_day_ET.`wsum` AS `wsum_ET`, 
archive_day_ET.`sumtime` AS `sumtime_ET`, 
archive_day_inTemp.`dateTime` AS `dateTime_inTemp`, 
archive_day_inTemp.`min` AS `min_inTemp`, 
archive_day_inTemp.`mintime` AS `mintime_inTemp`, 
archive_day_inTemp.`max` AS `max_inTemp`, 
archive_day_inTemp.`maxtime` AS `maxtime_inTemp`, 
archive_day_inTemp.`sum` AS `sum_inTemp`, 
archive_day_inTemp.`count` AS `count_inTemp`, 
archive_day_inTemp.`wsum` AS `wsum_inTemp`, 
archive_day_inTemp.`sumtime` AS `sumtime_inTemp`

还有

FROM ( 
 SELECT `dateTime` FROM archive_day_ET
 UNION 
 SELECT `dateTime` FROM archive_day_inTemp
) AS dt
LEFT JOIN archive_day_ET ON archive_day_ET.`dateTime` = dt.`dateTime` 
LEFT JOIN archive_day_inTemp ON archive_day_inTemp.`dateTime` = dt.`dateTime`

关于mysql - 批量将别名应用到 MYSQL 中的表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53894450/

相关文章:

php - 在将现有的 php 应用程序移植到 CakePHP 时,如何为模型使用非标准表/列名称?

mysql - 在 DQL 中的另一个 SELECT 查询中实现 SELECT 查询(Doctrine)

Mysql 在内连接上获得每组前 5 个结果

MySQL-当其中的变量不存在时获取 SUM

SQLite3 - 为什么引用数据不会删除?

请求 SQL 帮助 : SELECT Table A Joined with Table B (Max or Null)

php - 交换 SQL 主键而不影响自增?

php - jQuery 自动完成

mysql 更新触发器 : update "some" other rows

sql - 如何创建返回数组的 SQL Server 存储过程?