MySQL查询历史记录表中的记录

MySQL查询历史记录表中的记录,mysql,mysql-workbench,mysql-python,Mysql,Mysql Workbench,Mysql Python,我需要知道mysql查询中的逻辑,以跟踪所有更改的历史。下面的例子将解释我的期望 账表 帐户历史记录表 预期结果 +------+-----------+----------+----------+-------------------+---------------------+ | id | parameter | oldvalue | newvalue | event | event_datetime | +------+-----------+---

我需要知道mysql查询中的逻辑,以跟踪所有更改的历史。下面的例子将解释我的期望

账表

帐户历史记录表

预期结果

+------+-----------+----------+----------+-------------------+---------------------+
| id   | parameter | oldvalue | newvalue | event             | event_datetime      |
+------+-----------+----------+----------+-------------------+---------------------+
|    1 | emailid   | NULL     | def      | New Entry         | 2020-03-20 00:00:00 |
|    1 | emailid   | def      | ghi      | Change in account | 2020-04-03 00:00:00 |
|    1 | emailid   | ghi      | lmn      | Change in account | 2020-05-05 00:00:00 |
|    1 | emailid   | lmn      | opq      | Change in account | 2020-06-05 00:00:00 |
|    1 | emailid   | opq      | qrs      | Change in account | 2020-07-03 00:00:00 |
|    1 | emailid   | qrs      | abc      | Change in account | 2020-07-10 00:00:00 |
+------+-----------+----------+----------+-------------------+---------------------+
我有一个名为account的主表和一个名为account\u history的历史表。帐户中的每个更改都将在其历史记录表中进行跟踪,当前值将存储在历史记录表中。我希望我的输出是这样的。如果没有发生变化,则无需跟踪。我每天都有逻辑跟踪。但我想追踪过去的数据。 每日跟踪查询

mysql>  select id,'emailid',acch.emailid as oldvalue,acc.emailid as newvalue,'Change in account',acc.modified_date from account acc join account_history acch using(id) where acc.emailid!=acch.emailid and acc.modified_date=acch.modified_date;
+------+---------+----------+----------+-------------------+---------------------+
| id   | emailid | oldvalue | newvalue | Change in account | modified_date       |
+------+---------+----------+----------+-------------------+---------------------+
|    1 | emailid | qrs      | abc      | Change in account | 2020-07-10 00:00:00 |
+------+---------+----------+----------+-------------------+---------------------+
1 row in set (0.00 sec)
在跟踪过去的数据时感到困难。帮我做这个


mysql版本14.14发行版5.7.23


甚至超过1到2个查询就可以得到解决方案。创建任何中间表并得出解决方案都会很有帮助。

假设我们没有能力优化表结构。因此,主要的想法是做以下工作:

将初始数据转换为修改的顺序列表。 将此列表与其自身连接起来,其中新值记录的序列号具有下一个序列号相对旧值记录的序列号。 为了简单起见,MySQL 5.7的解决方案描述为两阶段查询。这可以在MySQL 8中更简单地完成。此外,这不是一个优雅的解决方案,而是一种简单的解释方法

第一步。顺序列表

-用于创建序列号的变量 设置@rn:=0; 选择@rn:=@rn+1作为rn, 啊* 从…起 -添加用于创建新条目的历史记录 选择id,空为emailid,“新条目”为事件,创建日期为修改日期 从帐户 协会 -添加中间历史记录 -需要分组以筛选相同的值,如“opq” 选择id、emailid、“帐户更改”作为事件,选择minmodified_日期作为modified_日期 按id、emailid从帐户\u历史记录组 协会 -为当前值添加历史记录 选择id、emailid、“帐户更改”作为事件、修改日期 从帐户 作为啊,, 选择@row:=0作为r 按id、修改日期排序的订单; 此查询将产生以下列表:

rn  id  emailid  event              modified_date
 1   1  NULL     New Entry          2020-03-20 00:00:00
 2   1  def      Change in account  2020-04-03 00:00:00
 3   1  ghi      Change in account  2020-05-05 00:00:00
 4   1  lmn      Change in account  2020-06-05 00:00:00
 5   1  opq      Change in account  2020-07-01 00:00:00
 6   1  qrs      Change in account  2020-07-10 00:00:00
 7   1  abc      Change in account  2020-07-10 00:00:00
第二步。自连接顺序列表

假设上面的列表名为子查询子查询、视图、临时表等。。以以下方式加入它:

选择s1.id, “emailid”作为emailid, s1.emailid作为旧值, s2.emailid作为newvalue, s1.事件, s1.修改日期 作为s1从子查询开始 将子查询作为s2连接 在s2.id=s1.id和s2.rn=s1.rn+1上
了解您使用的是哪个版本的mysql很有帮助。mysql版本14.14发行版5.7.23帐户中修改日期的值早于帐户历史中的最后一次更改?抱歉,这是错误的。将更新itI我不明白为什么def的事件日期是03-20,而实际上似乎是04-03。这个查询对我的版本非常有效。
mysql>  select id,'emailid',acch.emailid as oldvalue,acc.emailid as newvalue,'Change in account',acc.modified_date from account acc join account_history acch using(id) where acc.emailid!=acch.emailid and acc.modified_date=acch.modified_date;
+------+---------+----------+----------+-------------------+---------------------+
| id   | emailid | oldvalue | newvalue | Change in account | modified_date       |
+------+---------+----------+----------+-------------------+---------------------+
|    1 | emailid | qrs      | abc      | Change in account | 2020-07-10 00:00:00 |
+------+---------+----------+----------+-------------------+---------------------+
1 row in set (0.00 sec)
rn  id  emailid  event              modified_date
 1   1  NULL     New Entry          2020-03-20 00:00:00
 2   1  def      Change in account  2020-04-03 00:00:00
 3   1  ghi      Change in account  2020-05-05 00:00:00
 4   1  lmn      Change in account  2020-06-05 00:00:00
 5   1  opq      Change in account  2020-07-01 00:00:00
 6   1  qrs      Change in account  2020-07-10 00:00:00
 7   1  abc      Change in account  2020-07-10 00:00:00