【问题标题】:Find difference in 2 tables / recordsets MySQL在 2 个表/记录集 MySQL 中查找差异
【发布时间】:2014-07-20 19:57:07
【问题描述】:

我在 MySQL DB 中有 2 个表(A 和 B) 两者都具有非常相似的结构,因为每次用户更改表 A 中的数据以获得完整的更改历史记录时,表 B 都会插入所有数据的记录。 Lastupdate 列是 INT 类型,并以 UNIX 时间戳格式保持更新时间 所以假设表有这样的记录:

表A Id User_id Name1 Name2 Lastname Lastupdate 1 12 约翰·亚历山大·史密斯 1405594757 2 27 嫁给安波平斯 1405594877 3 51 让·克劳德·范法斯特 1405594677 表 B Id User_id Name1 Name2 Lastname Lastupdate 1 12 约翰·亚历山大·斯密特 1405594747 2 27嫁给安波平斯1405594757 3 51 让·克劳德·范法斯特 1405594757 1 12 约翰 1405594727 1 12 约翰·亚历克斯 1405594737 3 51 让·范法斯特 1405594757

对于表 A 中的每条记录,我希望查看与表 B 的最新记录的比较(基于 Lastupdate)以及更改了哪个字段的信息

所以对于 user_id = 12 我会有类似

Id User_id Name1 Name2 Lastname Lastupdate 1 12 John 改名 2:Alexander 改姓:Smith 1405594757

我正在尝试类似的东西

SELECT if(u1.name1 <> u2.name1, CONCAT("Changed: ",u1.name1), u1.name1) 
FROM tableA   u1,tableB u2
WHERE u1.user_id = 7433 AND u2.user_id = 7433

但是好像不太对,请指教

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    这应该表明哪些字段值发生了变化以及它们是什么以及它们变成了什么:

    select a.user_id,
           case when a.name1 <> b.name1 then concat(b.name1,' changed to ',a.name1) else null end as name1_chg,
           case when a.name2 <> b.name2 then concat(b.name2,' changed to ',a.name2) else null end as name2_chg,
           case when a.lastname <> b.lastname then concat(b.lastname,' changed to ',a.lastname) else null end as lastname_chg
      from tablea a
      join tableb b
        on a.user_id = b.user_id
     where b.lastupdate = (select max(x.lastupdate)
                             from tableb x
                            where x.lastupdate < a.lastupdate and x.user_id = a.user_id)
    

    【讨论】:

    • @HamidAlaei 谢谢,错过了那部分日期子
    • 感谢你们俩的细微调整 - user_id 正是我正在寻找的关系
    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多