【问题标题】:Bulk apply alias to table columns in MYSQL将别名批量应用于 MYSQL 中的表列
【发布时间】:2018-12-22 09:20:42
【问题描述】:

我正在使用第 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.

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

编辑:不幸的是,Union 没有唯一标识这些字段或将它们组合在一起,例如

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

结果:

【问题讨论】:

  • 这肯定只是一个(长)联合!?!
  • @Strawberry 感谢您的想法,遗憾的是它没有给出我想要的结果。请参阅编辑后的回复。
  • MySql 哪个版本?顺便说一句,为什么不将它们与每个联合选择不同的附加源字段联合起来?
  • 关于other SO post,MySql有group_concat
  • @LukStorms 谢谢卢克。我来看看 group_concat。您是否有一个易于访问的添加附加源字段的示例?

标签: mysql sql inner-join alias


【解决方案1】:

要生成包含这些表中所有字段名称的字符串,您可以查询 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_%'

dbfiddle 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_%'

dbfiddle 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`

【讨论】:

  • 嗨,卢克。谢谢。我稍后会看看。现在在我有阳光的时候做圣诞准备杂务和户外项目。感谢您的建议。
  • 嗨卢克。所以我今晚玩了这个,它似乎在 Django 之外工作正常 - 所以谢谢,但是在 Django 的连接/原始查询调用中它会中断并返回 1。如果我找到一个,我会继续玩并更新 Q解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多