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

seleccionar los que no coinciden

Estas en el tema de seleccionar los que no coinciden en el foro de Mysql en Foros del Web. Hola, podrian echarme una manito con algo que asumo debe ser sencillo pero no logro dar con ello, el tema es el sgte: tengo 3 ...
  #1 (permalink)  
Antiguo 11/08/2010, 10:46
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 9 meses
Puntos: 4
seleccionar los que no coinciden

Hola, podrian echarme una manito con algo que asumo debe ser sencillo pero no logro dar con ello, el tema es el sgte:

tengo 3 tablas(usuarios, modulos y permisos)

ejemplo

usuarios
id| nombre

modulos
id| modulo

permisos
id_usuario| id_modulo| consultar

entonces a un usuario le doy permisos creando un registro en la tabla permisos con su id, el id del modulo

con esta simple consulta puedo saber los modulos que he asignado a un usuario en particular :

Código:
SELECT  mo.id_interno,mo.modulo FROM bdsistema.modulos mo
LEFT JOIN bdsistema.permisos pe  ON pe.modulo = mo.id_interno
WHERE pe.usuario = 2  ORDER BY mo.modulo
pero como puedo hacer lo contrario? osea saber los módulos que no le he asignado aun a un usuario en particular?

cualquier luz será agradecida
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #2 (permalink)  
Antiguo 11/08/2010, 11:09
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: seleccionar los que no coinciden

Hola.

prueba cambiando la considicion de tu where por esto:

SELECT mo.id_interno,mo.modulo FROM bdsistema.modulos mo
LEFT JOIN bdsistema.permisos pe ON pe.modulo = mo.id_interno
WHERE tabla_persisos.id_usuario is null ORDER BY mo.modulo

si no te extrae nada intenta cambiando el orden de las tablas en el form y el left join

Suerte
  #3 (permalink)  
Antiguo 11/08/2010, 12:51
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 9 meses
Puntos: 4
Respuesta: seleccionar los que no coinciden

mmm, no me funka, talvez deberia realizar 2 consultas? una donde devuelvo todos los modulos y otra donde devuelvo los modulos asociados al usuario y luego .....chanfle ya me marie....
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #4 (permalink)  
Antiguo 11/08/2010, 12:59
Avatar de 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, 5 meses
Puntos: 2658
Respuesta: seleccionar los que no coinciden

Código MySQL:
Ver original
  1. SELECT  M.id, M.modulo
  2. FROM modulos M LEFT JOIN permisos P  ON M.modulo = P.id_interno
  3. WHERE P.id_interno IS NULL
  4. ORDER BY M.modulo
En el LEFT JOIN el orden de las tablas altera el producto. Por lo demás, estabas consultando por los campos que saldrían NULL (id_interno pertenece a permisos y no a modulos).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/08/2010, 15:22
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 9 meses
Puntos: 4
Respuesta: seleccionar los que no coinciden

no me resulta, haber explico un poco mas para que alguien con la cabeza mas despejada que yo me oriente:

digamos tengo mi tabla modulos

id | modulo
===============
1 | BODEGA
2 | MANTENCION
3 | SISTEMA
4 | CONTABILIDAD


luego mi tabla usuarios

id| usuario
===============
1 | JUAN
2 | MARIO
3 | JOSE
4 | CARLOS



y por ultimo mi tabla permisos

Id | id_modulo | id_usuario
===========================
1 | 1 | 2
2 | 1 | 3
3 | 2 | 4
4 | 3 | 1
5 | 4 | 1


bien siguiendo este ejemplo se darían las sgtes situaciones:

* el usuario JUAN tiene permiso a los módulos SISTEMA y CONTABILIDAD
* el usuario MARIO tiene permiso BODEGA
* el usuario JOSE tiene permiso BODEGA
* el usuario CARLOS tiene permiso MANTENCION

en mi consulta quiero saber a que módulos no le he dado permisos aun al usuario, digamos JUAN, el resultado debería ser:

BODEGA
MANTENCION

si pregunto lo mismo por el usuario MARIO deberia ser el resultado

MANTENCION
BODEGA
CONTABILIDAD

queda más claro? alguna idea?
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #6 (permalink)  
Antiguo 11/08/2010, 16:19
Avatar de 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, 5 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)
  #7 (permalink)  
Antiguo 11/08/2010, 18:04
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 9 meses
Puntos: 4
Respuesta: seleccionar los que no coinciden

mil gracias!!!! me salvaste la vida, en realidad me salvaste de un dolor de cabeza que ya me tiene palpitando un ojo, al final usé mi consulta asi para que que ajustara a mi tabla :

Código:
SELECT mo.id_interno,mo.modulo FROM bdsistema.modulos mo 
JOIN bdsistema.usuarios u  WHERE (u.id_interno, mo.id_interno) 
NOT IN (SELECT usuario,modulo FROM bdsistema.permisos) AND u.id_interno = 2
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar

Etiquetas: seleccionar
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 21:24.