2011-12-10 3 views
6

MySQLデータの2行を簡単に比較する方法があるのだろうかと思います。mysqlの行のDiffを

特に、私が持っているのは、各ユーザーの設定値のリストを含む表です。

ユーザーはGUIでこれらの設定を問題なく修正できます。

ここで私がしようとしているのは、ユーザーが新しいデータを保存するたびに、古いデータと保存されるデータの差分を見つけて、ログ...

私はこれを今やっている方法は、保存して比較する前に、変数に変数を変更したデータを見つけるためにユーザーに対応する行を読むことですが、私はそれが遅いと私は思っていますこれを行うスマートな方法はおそらくmysqlクエリ(たぶんテンポラリテーブルを使用して?)またはいくつかのPHP MySQLの関数を使用して私は知らない...

私はあなたのためにいくつかのアイデアを持っています。

(私はこの質問にチェック:https://stackoverflow.com/questions/218499/mysql-diff-toolを、それは私が探しています何よりも異なるロットであることが判明)事前に

ありがとう!

+0

ログを変更するだけの場合は、[triggers](http://dev.mysql.com/doc/refman/5.1/en/triggers.html)の使用を検討してください。その後、行が更新されるたびに手動でチェックすることを心配する必要はありません。 –

+0

@MichaelMiorは、あなたのコメントをスキップしました:(それに感謝して、その非常に役立っても –

+0

問題なし:)幸運を! –

答えて

4

これはPHPのarray_diff_assoc()関数で行うことができます。

ここでは、php配列に2行のデータがあります。

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

列の値が変更または追加された配列を返します。

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が2である古い行とトランザクションIDです:

編集

のMySQLでこれを行うには、あなたは、名前と値のペアで、このようなものを、それらを必要とするだろう新しい行:

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 
+0

+0私は非常に似た解決策を含む私の答えを削除しました。それは新しい_elements_だけを説明します。 _changed values_は考慮されていません。 –

+0

@ mmmshuddup上記の解決策が変更された値を考慮していないと言っているのであれば、私の目は私を欺くと言います。試してみてください。 –

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、笑。私はそれをもう一度読み、私が得たものをあなたに伝えます。その間、前のコメントを撤回します。 :) –