Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/10/2011, 13:57
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Mostrar en un select solo roles que no sean asignados

Hola danj:

Puedes utilizar la función NOT EXISTS O la función NOT IN para filtrar la información. En lo particular prefiero la primer opción, pues es mucho más versatil que utilizar una función IN. Sería más o menos así:

Código MySQL:
Ver original
  1. mysql> create table usuarios (idUsuario int,
  2.     -> nombre varchar(15));
  3. Query OK, 0 rows affected (0.17 sec)
  4.  
  5. mysql> insert into usuarios values (1, 'Juan David'), (2, 'otro usuario');
  6. Query OK, 2 rows affected (0.07 sec)
  7. Records: 2  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> select * from usuarios;
  10. +-----------+--------------+
  11. | idUsuario | nombre       |
  12. +-----------+--------------+
  13. |         1 | Juan David   |
  14. |         2 | otro usuario |
  15. +-----------+--------------+
  16. 2 rows in set (0.01 sec)
  17.  
  18. mysql> create table roles (idRol int, descripcion varchar(15));
  19. Query OK, 0 rows affected (0.11 sec)
  20.  
  21. mysql> insert into roles values (1, 'super admin'), (2, 'admin'),
  22.     -> (3, 'usuario'), (4, 'tintos');
  23. Query OK, 4 rows affected (0.13 sec)
  24. Records: 4  Duplicates: 0  Warnings: 0
  25.  
  26. mysql> select * from roles;
  27. +-------+-------------+
  28. | idRol | descripcion |
  29. +-------+-------------+
  30. |     1 | super admin |
  31. |     2 | admin       |
  32. |     3 | usuario     |
  33. |     4 | tintos      |
  34. +-------+-------------+
  35. 4 rows in set (0.00 sec)
  36.  
  37. mysql> create table usuarios_roles (idUR int, idUsuario int, idRol int);
  38. Query OK, 0 rows affected (0.17 sec)
  39.  
  40. mysql> insert into usuarios_roles values (1, 1, 2), (2, 1, 4), (3, 2, 1);
  41. Query OK, 3 rows affected (0.06 sec)
  42. Records: 3  Duplicates: 0  Warnings: 0
  43.  
  44. mysql> select * from usuarios_roles;
  45. +------+-----------+-------+
  46. | idUR | idUsuario | idRol |
  47. +------+-----------+-------+
  48. |    1 |         1 |     2 |
  49. |    2 |         1 |     4 |
  50. |    3 |         2 |     1 |
  51. +------+-----------+-------+
  52. 3 rows in set (0.00 sec)
  53.  
  54. mysql> #para mostrar los roles que no han sido asignados al usuario 1
  55. mysql> select * from roles r where not exists
  56.     -> (select idRol from usuarios_roles ur
  57.     -> where ur.idRol = r.idRol and ur.idUsuario = 1);
  58. +-------+-------------+
  59. | idRol | descripcion |
  60. +-------+-------------+
  61. |     1 | super admin |
  62. |     3 | usuario     |
  63. +-------+-------------+
  64. 2 rows in set (0.00 sec)
  65.  
  66. mysql> #para mostrar los roles que no han sido asignados al usuario 2
  67. mysql> select * from roles r where not exists
  68.     -> (select idRol from usuarios_roles ur
  69.     -> where ur.idRol = r.idRol and ur.idUsuario = 2);
  70. +-------+-------------+
  71. | idRol | descripcion |
  72. +-------+-------------+
  73. |     2 | admin       |
  74. |     3 | usuario     |
  75. |     4 | tintos      |
  76. +-------+-------------+
  77. 3 rows in set (0.00 sec)
  78.  
  79. mysql> #Mismo resultado que el anterior pero utilizando NOT IN
  80. mysql> select * from roles r where r.idRol not in
  81.     -> (select idRol from usuarios_roles ur
  82.     -> where ur.idUsuario = 2);
  83. +-------+-------------+
  84. | idRol | descripcion |
  85. +-------+-------------+
  86. |     2 | admin       |
  87. |     3 | usuario     |
  88. |     4 | tintos      |
  89. +-------+-------------+
  90. 3 rows in set (0.00 sec)

Finalmente también podrías hacer un LEFT JOIN y filtrar aquellos registros que te regresen NULL, más o menos así

Código MySQL:
Ver original
  1. mysql> select r.* from roles r left join usuarios_roles ur
  2.     -> on r.idRol = ur.idRol and ur.idUsuario = 2 where ur.idRol is null;
  3. +-------+-------------+
  4. | idRol | descripcion |
  5. +-------+-------------+
  6. |     2 | admin       |
  7. |     3 | usuario     |
  8. |     4 | tintos      |
  9. +-------+-------------+
  10. 3 rows in set (0.00 sec)

Dale un vistazo al script para ver si te puede servir.

Saludos
Leo.

Última edición por leonardo_josue; 27/10/2011 a las 14:04