¡Buenas, señores!
Intentaré ir al punto. En una base de datos registro los permisos de acceso que los usuarios de mi sistema tienen para ver el contenido de carpetas en mi servidor web.
Mi problema es formular la consulta correcta para saber cuáles son las carpetas superiores (y sólo las superiores) a las que puede acceder un usuario determinado. Me he planteado la siguiente, es sólo para darles una idea:
SELECT `directorios`.`codigo`, `ubicacion`, `carpeta`
FROM `directorios` INNER JOIN `permisos`
WHERE (`directorios`.`codigo` = `permisos`.`cod_carpeta`)
AND (`cod_usuario` = '2')
AND ( CONCAT(`ubicacion`,'/',`carpeta`)
NOT IN ( SELECT `ubicacion` FROM `directorios` ) )
ORDER BY `ubicacion`, `carpeta` ASC
Por favor consideren como ejemplo tres tablas con sus atributos y registros (todos varchar):
___________________________________
|____________USUARIOS____________|
|-codigo-|----nombre----------|
|---1---| carlos---------------|
|---2---| juan----------------|
________________________________________________
|________________DIRECTORIOS_________________|
|--codigo--|-------ubicacion------|-carpeta-|
|----1----| carp1 ----------------| carp1---|
|----2----| carp1/carp1.1---------| carp1.1--|
|----3----| carp2 ----------------| carp2---|
|----4----| carp3 ----------------| carp3---|
|----5----| carp3/carp3.1---------| carp3.1--|
______________________________
|__________PERMISOS__________|
|-cod_usuario-|-cod_carpeta-|
|-----1------|-----2------|
|-----2------|-----1------|
|-----2------|-----5------|
Disculpen su formato, soy usuario nuevo.
En la tabla permisos se muestra relativamente que JUAN tiene acceso a la “carpeta1” y la “carpeta3.1”, lo que implica que debe tener acceso a TRES carpetas (carpeta1, carpeta1.1 y carpeta3.1). Pero con la sentencia SQL de arriba obtengo:
|-codigo-|------ubicacion--------|-carpeta--|
|---2----| carp1/carp1.1---------| carp1.1--|
|---5----| carp3/carp3.1---------| carp3.1--|
Nada útil para listar su contenido con PHP,porque obtengo las carpetas de nivel jerárquico inferior. Intenté suprimir el NOT en la sentencia y obtengo lo siguiente:
|-codigo-|------ubicacion--------|-carpeta--|
|---1----| carp1 ----------------| carp1----|
Con este resultado me es posible listar en una pagina el contenido de toda la carp1, pero recordemos que juan tambien tiene acceso a la carp3.3, cuyo registro no es devuelto aquí.
Bien, espero haber sido claro y dado suficientes herramientas para solucionar mi problema.
Si se preguntan para qué demonios necesito esa consulta, la razón es que intento implementar en un sitio web un visualizador de directorios (carpetas) con la funcionalidad básica de Windows Explorer y pretendo que el acceso a su contenido esté controlado bajo permisos de usuarios registrados en MySQL.
Invito a colaborar a quien le interese el proyecto, y agradezco a los lectores.
aRISE!