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

Mostrar en un select solo roles que no sean asignados

Estas en el tema de Mostrar en un select solo roles que no sean asignados en el foro de Mysql en Foros del Web. Saludos a todos sucede que tengo una consulta la que consiste en mostrarme por medio de un select el campo nombre de la tabla roles ...
  #1 (permalink)  
Antiguo 27/10/2011, 12:47
Avatar de danj  
Fecha de Ingreso: octubre-2011
Ubicación: Calarcho
Mensajes: 53
Antigüedad: 12 años, 6 meses
Puntos: 1
Mostrar en un select solo roles que no sean asignados

Saludos a todos

sucede que tengo una consulta la que consiste en mostrarme por medio de un select
el campo nombre de la tabla roles y a su vez que no se vean los roles ya asiganados al usuario que estan almacenados

ejemplo:

usuario= juan david

roles = admin
superAdmin
usuario
tintos
se nesesita que si juan david tiene los permisos admin y tintos cuando quiera añadir en la base de datos por medio del select solo muestre los roles no asignado asi que en este caso ya no va a mostrar admin y tintos sino solo usuario y superAdmin

yo he trabajado pero no consigo sino que me mustre los dos que tengo asiganados

Código MySQL:
Ver original
  1. select r.nombre from roles r, usuarios_roles ur where ur.usuarios_idusuarios=2 and   r.idroles = ur.roles_idroles
  #2 (permalink)  
Antiguo 27/10/2011, 13:57
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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

Etiquetas: asignados, roles, select, tabla
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:58.