找出2个表/记录集MySQL的区别

时间:2014-07-20 19:57:07

标签: mysql sql database

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

TableA
Id  User_id Name1   Name2       Lastname    Lastupdate
1   12     John     Alexander   Smith       1405594757
2   27     Marry    Ann         Poppins     1405594877
3   51     Jean     Claude      VanFist     1405594677


Table B
Id  User_id Name1   Name2       Lastname    Lastupdate
1   12      John    Alexander   Smit        1405594747
2   27      Marry   Ann         Poppins     1405594757
3   51      Jean    Claude      VanFist     1405594757
1   12      John                            1405594727
1   12      John    Alex                    1405594737
3   51      Jean                VanFist     1405594757

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

因此,对于user_id = 12,我会有类似

的内容
Id  User_id Name1  Name2                    Lastname                Lastupdate
1   12      John   Changed name2:Alexander  Changed lastname: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

但似乎没有正确的方法请提供建议

1 个答案:

答案 0 :(得分:0)

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

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)