Ver Mensaje Individual
  #6 (permalink)  
Antiguo 20/02/2014, 13:22
leonardo_josue
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