将行的初始状态与最新状态MySQL相结合

mec1mxoz  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(121)

bounty将在7天后到期。对这个问题的回答有资格获得+100的声誉奖励。Bird87 ZA希望引起更多的关注这个问题。

我需要从数据库获取初始状态以及最新状态。这是两个以上的表格:

customer
ID|姓名|姓氏|道布|邮箱|电话
-|
|10|Steve|Bobble|1970年01月01日|UVW@XYZ.com|0123456789
15|詹姆斯|邦德|1950年01月1日|007@bond.com|0101010999

audit_log

Id|实体id|属性|old_value|new_value
-|
1|10|姓名|John|Steve
2|10|邮箱|abc@Def.com|UVW@XYZ.com
3|10|电话||0123456789

我期望的输出如下所示:

ID|姓名|姓氏|道布|邮箱|电话
-|
|10|Steve|Bobble|1970年01月01日|UVW@XYZ.com|0123456789
10_1|John|Bobble|01-01-1970|abc@Def.com|
15|詹姆斯|邦德|1950年01月1日|007@bond.com|0101010999

我最初有一个PHP脚本,它遍历所有customer行,然后将它们与audit_log行匹配并从那里生成输出,但速度非常慢,并且占用大量资源。

这样的事情可以直接在MySQL中实现吗?我该怎么做呢?

编辑

我已经向customer和输出表中添加了额外的行。输出表需要包含customer中的所有行,以及从audit_log构建的初始行的副本。

bzzcjhmw

bzzcjhmw1#

考虑到每个**entity-property对每个entity_id**值最多有一个更新,您可以使用以下SQL Select语句

SELECT a.entity_id, a.name, c.surname, c.dob, a.email, a.telephone
  FROM customer AS c
 CROSS JOIN ( SELECT entity_id, 
                     MAX(CASE WHEN property = 'name' THEN new_value END) AS name,
                     MAX(CASE WHEN property = 'email' THEN new_value END) AS email,
                     MAX(CASE WHEN property = 'telephone' THEN new_value END) AS telephone
                FROM audit_log 
               GROUP BY entity_id
               UNION ALL
              SELECT CONCAT(entity_id,'_1'), 
                     MAX(CASE WHEN property = 'name' THEN old_value END) AS name,
                     MAX(CASE WHEN property = 'email' THEN old_value END) AS email,
                     MAX(CASE WHEN property = 'telephone' THEN old_value END) AS telephone
                FROM audit_log 
               GROUP BY entity_id ) AS a
  WHERE a.entity_id = c.id

其中,取消透视oldnew值在AUDIT_LOG表中发生的properties更改,而从customer表中获取其他(未更改的值

Demo

相关问题