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 originalQuery OK, 0 rows affected (0.25 sec)
Query OK, 4 rows affected (0.03 sec)
+-----------+-----------+
| percodigo | codproces |
+-----------+-----------+
| 99 | 1 |
| 99 | 2 |
| 98 | 3 |
| 97 | 4 |
+-----------+-----------+
Query OK, 0 rows affected (0.08 sec)
2),(202, 2),(300, 3),(301, 3),(400, 4),(401, 4);
Query OK, 10 rows affected (0.03 sec)
+---------------+-----------+
| codsubproceso | codproces |
+---------------+-----------+
| 100 | 1 |
| 101 | 1 |
| 102 | 1 |
| 200 | 2 |
| 201 | 2 |
| 202 | 2 |
| 300 | 3 |
| 301 | 3 |
| 400 | 4 |
| 401 | 4 |
+---------------+-----------+
10 rows
in set (0.00 sec
)
Query OK, 0 rows affected (0.05 sec)
mysql
> insert into permisos
values (1,100,99), (1,101,99), (2,203,99), (3,300,98), (3,301,98);
Query OK, 5 rows affected (0.09 sec)
+-----------+--------------+-----------+
| codproces | codsubproces | percodigo |
+-----------+--------------+-----------+
| 1 | 100 | 99 |
| 1 | 101 | 99 |
| 2 | 203 | 99 |
| 3 | 300 | 98 |
| 3 | 301 | 98 |
+-----------+--------------+-----------+
mysql> #para obtener qué permisos le faltan al perfil 99 para el proceso 1
oces
and T2.percodigo
= T3.percodigo
-> where T1.codsubproceso
= T2.codsubproces
and T1.codproces
= T2.codproces
+---------------+-----------+
| codsubproceso | codproces |
+---------------+-----------+
| 102 | 1 |
+---------------+-----------+
mysql> #para obtener qué permisos le faltan al perfil 98 para el proceso 3
oces
and T2.percodigo
= T3.percodigo
-> where T1.codsubproceso
= T2.codsubproces
and T1.codproces
= T2.codproces
mysql> #para obtener qué permisos le faltan al perfil 97 para el proceso 4
oces
and T2.percodigo
= T3.percodigo
-> where T1.codsubproceso
= T2.codsubproces
and T1.codproces
= T2.codproces
+---------------+-----------+
| codsubproceso | codproces |
+---------------+-----------+
| 400 | 4 |
| 401 | 4 |
+---------------+-----------+
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