Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/04/2011, 08:41
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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