2011-12-10 21 views
6

Me pregunto si existe una manera fácil de comparar un par de filas de datos de MySQL.Difiere en una fila en mysql

En particular, lo que tengo es una tabla que contiene una lista de valores de configuración para cada usuario.

Un usuario puede modificar estas configuraciones en una interfaz gráfica de usuario en ningún problema.

Ahora, lo que intento hacer es: cada vez que un usuario guarda datos nuevos, quiero encontrar la diferencia entre los datos antiguos y los datos que se guardarán para averiguar qué columnas cambiaron y luego guardar en un registro ...

La forma en que lo estoy haciendo ahora es leyendo la fila correspondiente al usuario antes de guardarla y compararla, variable por variable para encontrar los datos modificados, pero me parece lenta y me pregunto si es una forma más inteligente de hacer esto, tal vez dentro de una consulta mysql (¿tal vez usando una tabla temporal?) o usando alguna función php mysql que no sé ...

Espero que tenga algunas ideas para mí.

(I marcó esta pregunta: ¿https://stackoverflow.com/questions/218499/mysql-diff-tool, pero que resulta ser muy diferente a lo que estoy buscando)

Gracias de antemano!

+0

Si todo lo que quiere hacer es registrar cambios, considere usar [triggers] (http://dev.mysql.com/doc/refman/5.1/en/triggers.html). Entonces no tiene que preocuparse por verificar manualmente cada vez que se actualicen las filas. –

+0

@MichaelMior se acaba de dar cuenta que salté su comentario :(gracias por eso, es muy útil también –

+0

No hay problema :) ¡Buena suerte! –

Respuesta

4

Puede hacerlo con la función array_diff_assoc() en PHP.

Aquí tenemos dos filas de datos en matrices php.

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

Devolverá una matriz en la que los valores de columna hayan cambiado o se hayan agregado.

Editar

Para hacer esto en MySQL, usted los necesita en pares de nombre y valor, algo como esto:

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 es la vieja fila y el ID de transacción 2 es el nueva fila:

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) 

Si mi lógica es correcta, debe ceder:

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

+0 Borré mi respuesta que contenía una solución muy similar. Solo representa nuevos elementos _. No tiene en cuenta _ valores cambiados_. –

+0

@mmmshuddup, si usted dice que la solución anterior no tiene en cuenta los valores modificados, entonces digo que mis ojos me engañan. Pruébalo y avísame. –

+0

mmm no .. Lo juro cuando escribí ese comentario, ¡el contenido de su respuesta fue diferente! lol. Lo volveré a leer y le diré lo que obtengo. Por el tiempo interino, me retracto de mi comentario anterior. :) –

Cuestiones relacionadas