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