mysql - 将别名批量应用于 MYSQL 中的表列
问题描述
我正在使用第 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;
在哪里 ?????更改以指示保存的数据类型。
自系统运行以来,dateTime 字段在每天午夜的所有表中镜像。
我想使用 dateTime 上的内部联接在所有表中生成单个数据集。但是为了避免写
SELECT ad1.maxtime as ad1_maxtime, ad2.maxtime as ad2_maxtime...
9个字段51次有没有一种方法可以批量创建别名,例如
ad1.* as ad_*, ad2.* as ad_* and so on.
我看过批量创建别名?但这似乎不适用于 MySQL。最终,数据被 Django ORM 使用。
编辑:不幸的是,Union 没有唯一标识这些字段或将它们组合在一起,例如
SELECT * FROM `archive_day_ET` UNION ALL SELECT * FROM `archive_day_inTemp`
结果是:
解决方案
要从这些表中生成包含所有字段名称的字符串,您可以查询 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的测试在这里
并生成 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的测试在这里
对于他们将生成的 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`
推荐阅读
- ionic-framework - 离子切换 ionChange 在 ionic 中被多次调用
- angular - 如何在 Angular 5 中允许不安全的 HTML
- python - 将字符串日期转换为 unix 时间
- pascal - 如何从 Pascal 中的文本文件中读取特定行
- android - 无法阻止 RecyclerView 中的 CardView 剪辑子项
- c - CTL 中的去饱和色彩
- nginx - nginx 重写 url 以删除子目录
- python - 为什么 GPU 上的乘法比 CPU 上的慢?
- python - 考虑 Pandas Dataframe 中的组,在列上显示下一个值
- javascript - 从 PathStrings 创建树