Ver Mensaje Individual
  #6 (permalink)  
Antiguo 11/08/2010, 16:19
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: seleccionar los que no coinciden

Usé finalmente este modelo:

Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `modulo`;
  2. CREATE TABLE  `modulo` (
  3.   `modulo_id` int(10) unsigned NOT NULL auto_increment,
  4.   `modulo` varchar(100) NOT NULL,
  5.   PRIMARY KEY  (`modulo_id`)
  6.  
  7. DROP TABLE IF EXISTS `usuario`;
  8. CREATE TABLE  `usuario` (
  9.   `usuario_id` int(10) unsigned NOT NULL auto_increment,
  10.   `nombre` varchar(45) NOT NULL,
  11.   PRIMARY KEY  (`usuario_id`)
  12.  
  13.  
  14. DROP TABLE IF EXISTS `permisos`;
  15. CREATE TABLE  `permisos` (
  16.   `usuario_id` int(10) unsigned NOT NULL,
  17.   `modulo_id` int(10) unsigned NOT NULL,
  18.   PRIMARY KEY  USING BTREE (`usuario_id`,`modulo_id`),
  19.   KEY `FK_permisos_modulo` (`modulo_id`),
  20.   CONSTRAINT `FK_permisos_modulo` FOREIGN KEY (`modulo_id`) REFERENCES `modulo` (`modulo_id`),
  21.   CONSTRAINT `FK_permisos_usario` FOREIGN KEY (`usuario_id`) REFERENCES `usuario` (`usuario_id`)
Como verás, este modelo no requiere (y en realidad es innecesario) un ID autoincremental para la tabla PERMISOS, ya que la nicidad está dada al ser declarada PK con ambos campos.

Una vez cargados los datos, la consulta queda, entonces:
Código MySQL:
Ver original
  1. mysql> SELECT  M.modulo_id, M.modulo, U.nombre
  2.     -> FROM
  3.     ->   modulo M JOIN usuario U
  4.     -> WHERE
  5.     ->   (U.usuario_id, M.modulo_id)
  6.     ->     NOT IN (SELECT * FROM permisos);
  7. +-----------+--------------+--------+
  8. | modulo_id | modulo       | nombre |
  9. +-----------+--------------+--------+
  10. |         1 | BODEGA       | JUAN   |
  11. |         4 | CONTABILIDAD | JUAN   |
  12. |         1 | BODEGA       | MARIO  |
  13. |         2 | MANTENCION   | MARIO  |
  14. |         3 | SISTEMAS     | MARIO  |
  15. |         2 | MANTENCION   | JOSE   |
  16. |         3 | SISTEMAS     | JOSE   |
  17. |         4 | CONTABILIDAD | JOSE   |
  18. |         2 | MANTENCION   | CARLOS |
  19. |         3 | SISTEMAS     | CARLOS |
  20. |         4 | CONTABILIDAD | CARLOS |
  21. +-----------+--------------+--------+
  22. 11 rows in set (0.00 sec)
Esos serían los permisos faltantes por usuario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)