Mysql 仅当数据自上次记录日期起已更改时,才将记录添加到表中

Mysql 仅当数据自上次记录日期起已更改时,才将记录添加到表中,mysql,date,merge,Mysql,Date,Merge,我需要帮助,试图找到一种只有在数据发生更改时才将数据添加到表中的有效方法 我有第一个表,它是LatestResults,只存储最新的结果(每个团队编号1个) 另一个名为HistoricResults的表存储了一份非常结果的副本,以备将来我需要它进行统计时使用 HisotryKey(Auto-Primary) TeamNumber TeamScore TeamWorkUnits RecordDateTime 1 - 1 500 - 600 - 2012-09-22 08:20:00 2 - 2 -

我需要帮助,试图找到一种只有在数据发生更改时才将数据添加到表中的有效方法

我有第一个表,它是LatestResults,只存储最新的结果(每个团队编号1个)

另一个名为HistoricResults的表存储了一份非常结果的副本,以备将来我需要它进行统计时使用

HisotryKey(Auto-Primary) TeamNumber TeamScore TeamWorkUnits RecordDateTime
1 - 1 500 - 600 - 2012-09-22 08:20:00
2 - 2 -400 - 6 - 2012-09-22 08:20:00
3 - 3- 90 - 15 - 2012-09-22 08:20:00
4 - 4 - 1 - 0 - 2012-09-22 08:20:00
5 - 1 490 - 600 - 2012-09-21 08:20:00
6 - 2 -300 - 6 - 2012-09-21 08:20:00
7 - 3- 40 - 15 - 2012-09-21 08:20:00
8 - 4 - 0 - 0 - 2012-09-21 08:20:00
因此,仅当数据TeamScore或TeamWorkUnits自RecordDateTime上次记录以来发生了更改时,我才希望将第一个表合并到第二个表中

也就是说,如果TeamScore和TeamWorkUnits相同,则保留历史记录表中最早的条目

如果可能的话,为了提高速度,我更愿意完全在MySQL中实现这一点

目前我每小时需要检查大约100000条记录


提前感谢您的帮助。

您可以尝试以下方法:

insert into HistoricResults 
  (teamNumber, TeamScore, TeamWorkUnits, RecordDateTime)
  select
    lr.teamNumber, 
    lr.TeamScore, 
    lr.TeamWorkUnits,
    NOW()
  from
    LatestResults lr
  where 
    exists (
      select 
        *
      from
        HistoricResults hs
      where
        hs.teamNumber = lr.teamNumber and
        (hs.TeamScore != lr.TeamScore or hs.TeamWorkUnits != lr.TeamWorkUnits)
        and hs.RecordDateTime = (select max(RecordDateTime) 
                                 from HistoricResults hs1 
                                 where hs1.teamNumber = lr.teamNumber)
      order by RecordDateTime desc
    )

下面是它的工作原理:
exist
中的子查询正在
historycresults
中查找
TeamScore
TeamWorkUnits
LatestResults
表记录不同的最新记录。如果找到此类记录,则外部
select
LatestResults
中选择适当的记录,并最终将此类记录插入
historycresults
您可以尝试以下方法:

insert into HistoricResults 
  (teamNumber, TeamScore, TeamWorkUnits, RecordDateTime)
  select
    lr.teamNumber, 
    lr.TeamScore, 
    lr.TeamWorkUnits,
    NOW()
  from
    LatestResults lr
  where 
    exists (
      select 
        *
      from
        HistoricResults hs
      where
        hs.teamNumber = lr.teamNumber and
        (hs.TeamScore != lr.TeamScore or hs.TeamWorkUnits != lr.TeamWorkUnits)
        and hs.RecordDateTime = (select max(RecordDateTime) 
                                 from HistoricResults hs1 
                                 where hs1.teamNumber = lr.teamNumber)
      order by RecordDateTime desc
    )

下面是它的工作原理:
exist
中的子查询正在
historycresults
中查找
TeamScore
TeamWorkUnits
LatestResults
表记录不同的最新记录。如果找到了这样的记录,那么外部
select
LatestResults
中选择合适的记录,这样的记录最终被插入到
historycresults

我不是MySQL专家,但为什么不把它放在一个表中呢?那不是更简单吗?。所以不是这样的。向我们展示一些代码/错误/努力,我们会帮助您解决。好的,对不起,我以为这是一个帮助那些没有知识/技能的人的网站。如果这里的人不想帮助像我这样的人,我会去其他地方看看。嗨,斯维什,谢谢你的格式设置,我在发帖时没有看到怎么做。至于为什么要使用这两个表,原因很简单,因为我每小时获得100000条记录,所以历史记录表将变得非常大。我主要只需要最新的数据,这就是为什么最新的表保持小而快速的查询。难道不能用索引和视图来解决吗?我不是MySQL专家,但为什么不把它放在一个表中呢?那不是更简单吗?。所以不是这样的。向我们展示一些代码/错误/努力,我们会帮助您解决。好的,对不起,我以为这是一个帮助那些没有知识/技能的人的网站。如果这里的人不想帮助像我这样的人,我会去其他地方看看。嗨,斯维什,谢谢你的格式设置,我在发帖时没有看到怎么做。至于为什么要使用这两个表,原因很简单,因为我每小时获得100000条记录,所以历史记录表将变得非常大。我主要只需要最新的数据,这就是为什么最新的表保持小而快速的查询。难道不能用索引和视图来解决吗?