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

Como puedo hacer esta consulta

Estas en el tema de Como puedo hacer esta consulta en el foro de Mysql en Foros del Web. Buenas a todos, estoy tratando de hacer una consulta, y nada que le doy... Tengo 4 tablas: PERFIL PERCODIGO CODPROCES PROCESO CODPROCES NOMPROCES SUBPROCESOS CODSUPROCESO ...
  #1 (permalink)  
Antiguo 29/04/2011, 07:18
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Como puedo hacer esta consulta

Buenas a todos, estoy tratando de hacer una consulta, y nada que le doy...
Tengo 4 tablas:

PERFIL
PERCODIGO
CODPROCES

PROCESO
CODPROCES
NOMPROCES

SUBPROCESOS
CODSUPROCESO
CODPROCES


PERMISOS
CODPROCES
CODSUBPROCESO
PERCODIGO

Con sus respectivas relaciones, lo que necesito es saber que PERMISOS NO TIENE ASIGNADO UN DETERMINADO PERFIL
Es decir, mostrar aquellos CODSUBPROCESO y CODPROCES que esten e la tabla SUBPROCESO, no estan en la tabla PERMISOS segun el PERCODIGO

Lo hice asi ,pero realmente no me funciono:


Código SQL:
Ver original
  1. SELECT * FROM PROCESO
  2. A RIGHT JOIN SUBPROCESOS B
  3. ON A.CODPROCES=B.CODPROCES
  4. LEFT JOIN PERMISOS C
  5. ON C.CODPROCES=B.CODPROCES
  6.  AND C.CODSUBPROCESO=B.CODSUBPROCESO
  7.  INNER JOIN PERFIL D ON  D.PERCODIGO=C.PERCODIGO
  8.  WHERE D.PERCODIGO='001'

Como podria hacer esta consulta?..Agradezco me puedan colaborar.......
  #2 (permalink)  
Antiguo 29/04/2011, 08:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como puedo hacer esta consulta

Hola oscarbt:

Me hubiera gustado que también nos pusieras algunos datos de ejemplo, pero bueno, a ver que se puede hacer. Para obtener este tipo de consultas, donde tiene que extrer un subconjunto de datos siempre recomiendo utilizar las sentencias EXISTS y NOT EXISTS. También podrías utilizar IN y NOT IN, pero por experiencia propia te digo que estas últimas son un poco más lentas. veamos si esto es lo que necesitas:

Código MySQL:
Ver original
  1. mysql> create table perfil(percodigo int, codproces int);
  2. Query OK, 0 rows affected (0.25 sec)
  3.  
  4. mysql> insert into perfil values (99, 1),(99, 2),(98, 3),(97, 4);
  5. Query OK, 4 rows affected (0.03 sec)
  6. Records: 4  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> select * from perfil;
  9. +-----------+-----------+
  10. | percodigo | codproces |
  11. +-----------+-----------+
  12. |        99 |         1 |
  13. |        99 |         2 |
  14. |        98 |         3 |
  15. |        97 |         4 |
  16. +-----------+-----------+
  17. 4 rows in set (0.00 sec)
  18.  
  19. mysql> create table subprocesos(codsubproceso int, codproces int);
  20. Query OK, 0 rows affected (0.08 sec)
  21.  
  22. mysql> insert into subprocesos values (100, 1),(101, 1),(102, 1),(200, 2),(201,
  23. 2),(202, 2),(300, 3),(301, 3),(400, 4),(401, 4);
  24. Query OK, 10 rows affected (0.03 sec)
  25. Records: 10  Duplicates: 0  Warnings: 0
  26.  
  27. mysql> select * from subprocesos;
  28. +---------------+-----------+
  29. | codsubproceso | codproces |
  30. +---------------+-----------+
  31. |           100 |         1 |
  32. |           101 |         1 |
  33. |           102 |         1 |
  34. |           200 |         2 |
  35. |           201 |         2 |
  36. |           202 |         2 |
  37. |           300 |         3 |
  38. |           301 |         3 |
  39. |           400 |         4 |
  40. |           401 |         4 |
  41. +---------------+-----------+
  42. 10 rows in set (0.00 sec)
  43.  
  44. mysql> create table permisos(codproces int, codsubproces int, percodigo int);
  45. Query OK, 0 rows affected (0.05 sec)
  46.  
  47. mysql> insert into permisos values (1,100,99), (1,101,99), (2,203,99), (3,300,98
  48. ), (3,301,98);
  49. Query OK, 5 rows affected (0.09 sec)
  50. Records: 5  Duplicates: 0  Warnings: 0
  51.  
  52. mysql> select * from permisos;
  53. +-----------+--------------+-----------+
  54. | codproces | codsubproces | percodigo |
  55. +-----------+--------------+-----------+
  56. |         1 |          100 |        99 |
  57. |         1 |          101 |        99 |
  58. |         2 |          203 |        99 |
  59. |         3 |          300 |        98 |
  60. |         3 |          301 |        98 |
  61. +-----------+--------------+-----------+
  62. 5 rows in set (0.00 sec)
  63.  
  64. mysql> #para obtener qué permisos le faltan al perfil 99 para el proceso 1
  65. mysql> select T1.* from subprocesos T1 where not exists(
  66.     -> select * from permisos T2 inner join perfil T3 on T2.codproces = T3.codpr
  67. oces and T2.percodigo = T3.percodigo
  68.     -> where T1.codsubproceso = T2.codsubproces and T1.codproces = T2.codproces
  69. and T3.percodigo = 99)
  70.     -> and T1.codproces = 1;
  71. +---------------+-----------+
  72. | codsubproceso | codproces |
  73. +---------------+-----------+
  74. |           102 |         1 |
  75. +---------------+-----------+
  76. 1 row in set (0.00 sec)
  77.  
  78. mysql> #para obtener qué permisos le faltan al perfil 98 para el proceso 3
  79. mysql> select T1.* from subprocesos T1 where not exists(
  80.     -> select * from permisos T2 inner join perfil T3 on T2.codproces = T3.codpr
  81. oces and T2.percodigo = T3.percodigo
  82.     -> where T1.codsubproceso = T2.codsubproces and T1.codproces = T2.codproces
  83. and T3.percodigo = 98)
  84.     -> and T1.codproces = 3;
  85. Empty set (0.00 sec)
  86.  
  87. mysql> #para obtener qué permisos le faltan al perfil 97 para el proceso 4
  88. mysql> select T1.* from subprocesos T1 where not exists(
  89.     -> select * from permisos T2 inner join perfil T3 on T2.codproces = T3.codpr
  90. oces and T2.percodigo = T3.percodigo
  91.     -> where T1.codsubproceso = T2.codsubproces and T1.codproces = T2.codproces
  92. and T3.percodigo = 97)
  93.     -> and T1.codproces = 4;
  94. +---------------+-----------+
  95. | codsubproceso | codproces |
  96. +---------------+-----------+
  97. |           400 |         4 |
  98. |           401 |         4 |
  99. +---------------+-----------+
  100. 2 rows in set (0.00 sec)

Si observas el proceso 1 tiene tres subprocesos (100, 101, 102). El perfil 99 sólo tiene permisos para los procesos 100 y 101, por lo tanto la primer consulta regresa un 102. El proceso 3 tiene dos subprocesos (300 y 301), el perfil 98 tiene permisos sobre los dos subprocesos, por lo tanto la segunda consulta es vacía. El proceso 4 tiene dos subprocesos (400, 401), el perfin 97 no tiene ningún permiso sobre este proceso, por lo tanto la consulta te regresa los dos registros.

Dale un vistazo para ver si te sirve.

Saludos
Leo
  #3 (permalink)  
Antiguo 29/04/2011, 09:37
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Como puedo hacer esta consulta

Mas completo no puede ser...mucha gracias .......
  #4 (permalink)  
Antiguo 29/04/2011, 09:40
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: Como puedo hacer esta consulta

Pero observo algo y es que a la consulta se le esta pasando el codigo del proceso...he ahi el problema.....ese campo codproces no lo debo pasar como parametro para el query....
  #5 (permalink)  
Antiguo 29/04/2011, 10:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como puedo hacer esta consulta

hola de nuevo oscarbt:

Si simplemente le quitas el código del proceso entonces te listará todos los permisos de todos los procesos que el perfil no tiene asignado,

Código MySQL:
Ver original
  1. mysql> select T1.* from subprocesos T1 where not exists(
  2.     -> select * from permisos T2 inner join perfil T3 on T2.codproces = T3.codpr
  3. oces and T2.percodigo = T3.percodigo
  4.     -> where T1.codsubproceso = T2.codsubproces and T1.codproces = T2.codproces
  5. and T3.percodigo = 99);
  6. +---------------+-----------+
  7. | codsubproceso | codproces |
  8. +---------------+-----------+
  9. |           102 |         1 |
  10. |           200 |         2 |
  11. |           201 |         2 |
  12. |           202 |         2 |
  13. |           300 |         3 |
  14. |           301 |         3 |
  15. |           400 |         4 |
  16. |           401 |         4 |
  17. +---------------+-----------+
  18. 8 rows in set (0.02 sec)

Es decir, al perfil 99 le falta 1 permiso para el proceso 1, y todos los permisos para los procesos 2, 3, 4 (en los datos que puse de ejemplo hay un error en la tabla de permisos, pues asigna un permiso 203 que no existe, pero eso no debería pasar contigo si tienes bien definidas las FK).

Si esto NO ES LO QUE NECESITAS, entonces publica algunos datos de ejemplo y dinos qué necesitas de salida, pues como te dije en mi primer post, sin esta información sólo estoy adivinando qué quieres obtener en realidad,

Saludos.
Leo.

Etiquetas: Ninguno
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 14:13.