我想知道是否有一种简单的方法来比较几行MySQL数据.
特别是,我所拥有的是一个包含每个用户的设置值列表的表.
用户可以毫无问题地在gui中修改这些设置.
现在,我要做的是:每当用户保存新数据时,我想找到旧数据和待保存数据之间的差异,以找出哪些列已更改,然后保存到日志中. .
我现在正在这样做的方法是在保存和比较它之前读取对应于用户的行,通过变量变量来查找已更改的数据,但我发现它很慢,我想知道是否有更聪明的方法来做到这一点,也许在mysql查询里面(可能使用临时表?)或者使用一些我不知道的php mysql函数...
我希望你对我有一些想法.
(我检查了这个问题:https://stackoverflow.com/questions/218499/mysql-diff-tool,但结果与我想要的有很多不同)
提前致谢!
您可以使用array_diff_assoc()PHP中的函数来执行此操作。
在这里,我们在php数组中有两行数据。
$newValues = array_diff_assoc($afterRow, $beforeRow);
Run Code Online (Sandbox Code Playgroud)
它将返回一个数组,其中任何列值都已更改或添加。
编辑
要在MySQL中执行此操作,您需要使用名称/值对对,例如:
Prefs
----------------------------------------------
UserID TransactionID Name Value
----------------------------------------------
1 1 Font Sans Serif
1 1 Color Red
1 1 Height 100
1 1 Width 400
1 2 Font Verdana
1 2 Color Red
1 2 Height 100
1 2 Indent 50
Run Code Online (Sandbox Code Playgroud)
TransactionID 1是旧行,而Transaction ID 2是新行:
SELECT * FROM Prefs new
LEFT JOIN Prefs old
ON new.Name = old.Name
AND new.Value = old.Value
WHERE UserID = 1
AND new.TransactionID = 2
AND old.TransactionID = 1
AND (old.Name IS NULL OR old.Value IS NULL)
Run Code Online (Sandbox Code Playgroud)
如果我的逻辑是正确的,应该产生:
----------------------------------------------
UserID TransactionID Name Value
----------------------------------------------
1 2 Font Verdana
1 2 Indent 50
Run Code Online (Sandbox Code Playgroud)