mysql 中的行差异

发布于 2024-12-20 07:12:51 字数 509 浏览 0 评论 0原文

我想知道是否有一种简单的方法来比较几行 MySQL 数据。

特别是,我拥有的是一个包含每个用户的设置值列表的表。

用户可以毫无问题地在 GUI 中修改这些设置。

现在,我想做的是:每当用户保存新数据时,我想找到旧数据和要保存的数据之间的差异,以找出哪些列发生了更改,然后保存到日志中。 ,

我现在这样做的方法是在保存和比较之前读取与用户相对应的行,逐个变量地查找更改的数据,但我发现它很慢,我想知道是否有更聪明的方法来做到这一点 也许在 mysql 查询中(也许使用临时表?)或者通过使用一些我不知道的 php mysql 函数...

我希望你对我有一些想法。

(我检查了这个问题:https://stackoverflow.com/questions/218499/mysql-diff-tool ,但这与我正在寻找的有很大不同)

提前致谢!

I am wondering if there is an easy way to compare a couple of rows of MySQL data.

In particular, what i have is a table containing a list of setting values for each user.

A user can modify these settings in a gui in no problem.

Now, what i am trying to do is : whenever a user saves new data, i want to find the diff between the old data and the to-be-saved data to find out which columns where changed and later save to a log...

The way i am doing this right now is reading the row corresponding to the user before saving and comparing it, variable by variable to find the changed data but i find it slow and i am wondering if there is a smarter way to do this, perhaps inside a mysql query (maybe using a temporary table?) or by using some php mysql function i don't know about...

I hope you have some ideas for me.

(I checked this question : https://stackoverflow.com/questions/218499/mysql-diff-tool , but that turns out to be a lot different than what i am looking for)

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情仇皆在手 2024-12-27 07:12:51

您可以使用 PHP 中的 array_diff_assoc() 函数来完成此操作。

这里我们有两行 php 数组数据。

$newValues = array_diff_assoc($afterRow, $beforeRow);

它将返回一个数组,其中任何列值已更改或添加。

编辑

要在 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

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)

如果我的逻辑是正确的,应该屈服:

----------------------------------------------
UserID   TransactionID   Name       Value
----------------------------------------------
1        2               Font       Verdana
1        2               Indent     50

You can do this with the array_diff_assoc() function in PHP.

Here we have two rows of data in php arrays.

$newValues = array_diff_assoc($afterRow, $beforeRow);

It will return an array where any column values have changed or been added.

Edit

To do this in MySQL, you'd need them in name value pairs, something like this:

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

TransactionID 1 is the old row and Transaction ID 2 is the new row:

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)

If my logic is right, should yield:

----------------------------------------------
UserID   TransactionID   Name       Value
----------------------------------------------
1        2               Font       Verdana
1        2               Indent     50
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文