Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Estas en el tema de Comparar 2 tablas identicas y obtener registros que no coinciden mysql en el foro de Mysql en Foros del Web. Hola! que tal. Solicito de su apoyo ya que he intentado buscar la solución a este inconveniente pero no he podido, es por eso que ...
  #1 (permalink)  
Antiguo 19/02/2014, 23:19
 
Fecha de Ingreso: julio-2012
Mensajes: 18
Antigüedad: 12 años, 4 meses
Puntos: 0
Sonrisa Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Hola! que tal.

Solicito de su apoyo ya que he intentado buscar la solución a este inconveniente pero no he podido, es por eso que solicito un poco de ayuda.

Bueno, tengo dos tablas identicas user_old y user_new con la siguiente estructura:

Código SQL:
Ver original
  1. user_old
  2.     (
  3.         ID INT NOT NULL AUTO_INCREMENT,
  4.         OPRID VARCHAR(100) NOT NULL,                 //nick del usuario
  5.         NAMEUSR VARCHAR(100) NOT NULL,           //nombre completo
  6.         ROLNAME VARCHAR(100) NOT NULL,           //roles del usuario
  7.         PRIMARY KEY (ID),
  8.         INDEX indx_usr_old (OPRID, ROLNAME)
  9.     )
  10.  
  11.  user_new
  12.     (
  13.         ID INT NOT NULL AUTO_INCREMENT,
  14.         OPRID VARCHAR(100) NOT NULL,            //nick del usuario
  15.         NAMEUSR VARCHAR(100) NOT NULL,      //nombre completo
  16.         ROLNAME VARCHAR(100) NOT NULL,     //roles del usuario
  17.         PRIMARY KEY (ID),
  18.         INDEX indx_usr_old (OPRID, ROLNAME)
  19.     )
En estas dos tablas guardo información de los roles de un usuario, como verán una contiene informacion antigua (user_old) y la otra se encuentra actualizada (user_new).
Lo que requiero es comparar los roles de la tabla user_old vs user_new para obtener que roles se han modificado.

He utilizado la siguiente sentencia pero no he tenido el resultado que necesito:
Código SQL:
Ver original
  1. SELECT OPRID, NAMEUSR, ROLNAME
  2. FROM user_new
  3. WHERE ROLNAME NOT IN (SELECT ROLNAME FROM user_old)

De antemano les agradecería que me pudieran orientar un poco ya que me encuentro algo atorado.

Muchas gracias.!!!

Última edición por gnzsoloyo; 20/02/2014 a las 06:10
  #2 (permalink)  
Antiguo 20/02/2014, 04:50
 
Fecha de Ingreso: diciembre-2005
Mensajes: 65
Antigüedad: 19 años
Puntos: 4
Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Código SQL:
Ver original
  1. SELECT t1.id, t1.rolname, t2.rolname
  2. FROM user_old t1 INNER JOIN user_new t2 ON t1.id=t2.id
  3. WHERE t1.rolname<>t2.rolname

Última edición por gnzsoloyo; 20/02/2014 a las 06:10
  #3 (permalink)  
Antiguo 20/02/2014, 09:27
 
Fecha de Ingreso: julio-2012
Mensajes: 18
Antigüedad: 12 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Antes que nada muchas gracias piwy por tomarte tu tiempo, pero la consulta no me devuelve los cambios que se han realizado en la tabla user_old, de hecho muestra datos que no coinciden con los que cuenta.

De cualquier forma te agradezco tu tiempo, seguiré intentando.
  #4 (permalink)  
Antiguo 20/02/2014, 10:32
 
Fecha de Ingreso: diciembre-2005
Mensajes: 65
Antigüedad: 19 años
Puntos: 4
Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Sinceramente, tu pregunta es ambigua. Deberías detallar mejor lo que quieres e incluso poner un ejemplo.
  #5 (permalink)  
Antiguo 20/02/2014, 11:06
 
Fecha de Ingreso: julio-2012
Mensajes: 18
Antigüedad: 12 años, 4 meses
Puntos: 0
Sonrisa Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Hola! piwy nuevamente gracias por tomarte tu tiempo.
Mira creo que es claro lo que necesito, aquí va un ejemplo:

Tengo la tabla user_old con los siguientes datos:

ID OPRID NAMEUSR ROLENAME
1 PPEREZ PEPITO PEREZ ACCESO PORTAL WEB
2 PPEREZ PEPITO PEREZ ADMINISTRADOR
3 PPEREZ PEPITO PEREZ CONSULTA CAB
4 PPEREZ PEPITO PEREZ REPORTE CAB

En la tabla actualizada (user_new) tengo los datos del mismo usuario pero actualizados.

ID OPRID NAMEUSR ROLENAME
1 PPEREZ PEPITO PEREZ ACCESO PORTAL WEB
2 PPEREZ PEPITO PEREZ ADMINISTRADOR
3 PPEREZ PEPITO PEREZ CONSULTA PORTAL


Como se puede observar en los roles del usuario cambiaron, ahora tiene un nuevo rol CONSULTA PORTAL, pero se le quitaron los roles CONSULTA CAB y REPORTE CAB

Entonces lo que necesito es realizar la consulta que me muestre estos cambios realizados.

Espero que este mas claro lo que necesito, nuevamente agradezco tu tiempo y apoyo.

Saludos
  #6 (permalink)  
Antiguo 20/02/2014, 13:22
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Hola rhapsodyred:

En realidad tienes muchas formas para obtener lo que necesitas, dependiendo de cómo quieres presentar la información, pero antes que nada algunas consideraciones:

1. Según lo que planteas, los campos OPRID y NAMEUSR no cambian, sólo el ROLENAME.

2. el campo ID es tu campo llave y este tampoco debería considerarse para la consulta.

Partiendo de estos supuestos, te repito, hay muchas formas de hacer lo que pides. Hay un viejo dicho que dice "DIVIDE Y VENCERÁS", la consulta la puedes dividir en tres partes:

- Los registros que no cambiaron.
- Los privilegios originales que se eliminaron.
- Los privilegios nuevos que se agregaron.

De esta manera, puedes hacer tres subconsultas y unirlas con UNION, algo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM user_old;
  2. +------+--------+--------------+-------------------+
  3. | ID   | OPRID  | NAMEUSR      | ROLENAME          |
  4. +------+--------+--------------+-------------------+
  5. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB |
  6. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     |
  7. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA CAB      |
  8. |    4 | PPEREZ | PEPITO PEREZ | REPORTE CAB       |
  9. +------+--------+--------------+-------------------+
  10. 4 rows in set (0.06 sec)
  11.  
  12. mysql> SELECT * FROM user_new;
  13. +------+--------+--------------+-------------------+
  14. | ID   | OPRID  | NAMEUSR      | ROLENAME          |
  15. +------+--------+--------------+-------------------+
  16. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB |
  17. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     |
  18. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA PORTAL   |
  19. +------+--------+--------------+-------------------+
  20. 3 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT user_old.*, 'SIN CAMBIOS' estatus
  23.     -> FROM user_old
  24.     -> INNER JOIN user_new ON
  25.     -> user_old.oprid = user_new.oprid AND
  26.     -> user_old.nameusr = user_new.nameusr AND
  27.     -> user_old.rolename = user_new.rolename
  28.     -> UNION
  29.     -> SELECT user_old.*, 'ELIMINADOS' estatus
  30.     -> FROM user_old
  31.     -> WHERE NOT EXISTS ( SELECT * FROM user_new
  32.     ->                    WHERE
  33.     ->                       user_old.oprid = user_new.oprid AND
  34.     ->               user_old.nameusr = user_new.nameusr AND
  35.     ->               user_old.rolename = user_new.rolename)
  36.     -> UNION
  37.     -> SELECT user_new.*, 'AGREGADOS' estatus
  38.     -> FROM user_new
  39.     -> WHERE NOT EXISTS ( SELECT * FROM user_old
  40.     ->                    WHERE
  41.     ->                       user_old.oprid = user_new.oprid AND
  42.     ->               user_old.nameusr = user_new.nameusr AND
  43.     ->               user_old.rolename = user_new.rolename);
  44. +------+--------+--------------+-------------------+-------------+
  45. | ID   | OPRID  | NAMEUSR      | ROLENAME          | estatus     |
  46. +------+--------+--------------+-------------------+-------------+
  47. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB | SIN CAMBIOS |
  48. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     | SIN CAMBIOS |
  49. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA CAB      | ELIMINADOS  |
  50. |    4 | PPEREZ | PEPITO PEREZ | REPORTE CAB       | ELIMINADOS  |
  51. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA PORTAL   | AGREGADOS   |
  52. +------+--------+--------------+-------------------+-------------+
  53. 5 rows in set (0.25 sec)

Dale un vistazo para ver si te sirve, trata de ejecutar cada subconsulta por separado para que entiendas su lógica, si continuas con problemas coméntalo en el foro.

Saludos
Leo
  #7 (permalink)  
Antiguo 20/02/2014, 13:32
 
Fecha de Ingreso: diciembre-2005
Mensajes: 65
Antigüedad: 19 años
Puntos: 4
Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Prueba con algo del estilo:

Código MySQL:
Ver original
  1. SELECT 'Diferencias_new', t1.OPRID, t1.NAMEUSR, t1.ROLNAME
  2. FROM user_new t1
  3. WHERE t1.ROLNAME NOT IN (SELECT t2.ROLNAME FROM user_old t2 where t1.nameusr=t2.nameusr)
  4.  
  5.  
  6. SELECT 'Diferencias_old', t1.OPRID, t1.NAMEUSR, t1.ROLNAME
  7. FROM user_old t1
  8. WHERE t1.ROLNAME NOT IN (SELECT t2.ROLNAME FROM user_new t2 where t1.nameusr=t2.nameusr)

Opppsss, no había visto ya la respuesta anterior...
  #8 (permalink)  
Antiguo 20/02/2014, 16:49
 
Fecha de Ingreso: julio-2012
Mensajes: 18
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Comparar 2 tablas identicas y obtener registros que no coinciden mysql

leonardo_josue :
Te agradezco muchísimo tu tiempo y quiero comentarte que tu respuesta simplemente fue excelente, es justamente lo que requería, tu explicación y la forma de plantear mi duda fue genial. En verdad muchas gracias. Me funciono OK.

piwy también te agradezco nuevamente por tu tiempo de darle seguimiento a mi tema la verdad estoy muy agradecido con ustedes.

Saludos!

Etiquetas: comparacion, tablasmysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:34.