Diff на ряд в MySQL - PullRequest
       1

Diff на ряд в MySQL

7 голосов
/ 10 декабря 2011

Мне интересно, есть ли простой способ сравнить пару строк данных MySQL.

В частности, у меня есть таблица, содержащая список значений настроек для каждого пользователя.

Пользователь может без проблем изменять эти настройки в графическом интерфейсе.

Теперь я пытаюсь сделать следующее: всякий раз, когда пользователь сохраняет новые данные, я хочу найти разницу между старыми данными и данными, которые нужно сохранить, чтобы выяснить, какие столбцы были изменены, а затем сохранить в войти ...

То, как я делаю это сейчас, - это чтение строки, соответствующей пользователю, перед ее сохранением и сравнением, переменная за переменной, чтобы найти измененные данные, но я нахожу это медленным, и мне интересно, есть ли более разумный способ сделать это, возможно, внутри запроса mysql (может быть, с использованием временной таблицы?) или с помощью какой-то функции php mysql, о которой я не знаю ...

Надеюсь, у вас есть идеи для меня.

(я проверил этот вопрос: https://stackoverflow.com/questions/218499/mysql-diff-tool, но оказалось, что он сильно отличается от того, что я ищу)

Заранее спасибо!

1 Ответ

5 голосов
/ 10 декабря 2011

Вы можете сделать это с помощью функции array_diff_assoc() в PHP.

Здесь у нас есть две строки данных в массивах 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
...