mysql - 从多列重新格式化 MySQL 表

标签 mysql view triggers

我是 MySQL 世界的新手,我被安排在经常使用它的位置。我目前遇到的问题是,我们正在从多个不同的站点接收数据,这些站点包含许多列,例如下面的表 1:

DateTime | Temperature1 | Temperature2 | Temperature3 | Ect.

我们的很多工程师都喜欢将这些数据提取到 Excel 工作表中,更具体地说是数据透视表,以便于操作。我们也有一些程序使用这些数据来生成图表等。这些程序特别要求数据采用以下格式:

日期时间 | p值 | p名称

pValue 是温度列的值,pName 是该值来自的列名。我尝试创建一个简单的 View 来以上述格式重新格式化数据,但没有取得太大的成功。相反,我求助于一个非常长的 View ,如下所示;

SELECT `DateTime` AS `DateTime`,
       `Temperature1` AS `pValue`,
       'Temperature1' AS `pName` 
FROM `table1` 
UNION
SELECT `DateTime` AS `DateTime`,
       `Temperature2` AS `pValue`,
       'Temperature2' AS `pName` 
FROM `table1`

然后,代码会针对每个单独的温度列重复自身。它在我们只有少量数据时有效,但随着数据的增加,我们查询的持续时间会减少,这将成为一个相当大的问题。根据我在网上阅读的内容,使用 View 可能不是处理此类大型数据集的方法,尤其是考虑到我无法为其中的任何内容编制索引。我考虑过创建一个触发器来写入数据,因为它被插入到一个新的重新格式化的表中,但我不知道如何开始。

总而言之,我只是在寻找一些关于重新格式化这些数据的最有效方法的指导。触发器会更好地服务于此目的还是我只需要更好的优化 View 。或者有没有我什至没有想到的第三种选择?

最佳答案

不要将温度读数存储为多列。这称为“重复组”,它不是推荐的数据库设计,因为您现在遇到的困难。相反,每行存储一个温度。

您可以在接收仪器数据的表上创建一个触发器,以便它将多行插入到一个适当组织的表中。

CREATE TRIGGER FixDataInputs AFTER INSERT ON MyRepeatingGroupsTable
FOR EACH ROW
  INSERT INTO MyNormalizedTable (DateTime, Temperature, Instrument) 
  VALUES (NEW.DateTime, NEW.Temperature1, 1),
         (NEW.DateTime, NEW.Temperature2, 2),
         (NEW.DateTime, NEW.Temperature3, 3),
         (NEW.DateTime, NEW.Temperature4, 4);

现在您可以更轻松地查询新表。

关于mysql - 从多列重新格式化 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615701/

相关文章:

mysql - 在mysql中动态引入记录

javascript - Node.js 服务器循环中的 SQL 查询

mysql - MYSQL 外键索引

javascript - 模型渲染内 View : toJSON is not a function

Mysql触发器抛出 'TRIGGER command denied to user'

ruby-on-rails - 将 button_to 与文本 : twitter-bootstrap-rails 内联

mysql - 将 SQL 更新语句转换为 View 语句

PHP/MySQL 检测表中价格列的变化

mysql - 新表插入的触发器

mysql - 是否有任何工具可以帮助将 innoDB 表转换为 mysql 集群的 NDB 表?