Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/07/2012, 17:10
r4mos
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años
Puntos: 2
Consulta iterativa

Buenas, estoy haciendo un sistema para subir archivos. Los guardo todos en una carpeta y como nombre les pongo el id de la base de datos. Su tabla resumida es esta:

CREATE TABLE `files` (
`id` int(11) NOT NULL,
`name` varchar(250) NOT NULL,
`folder` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)

Para simular las carpetas utilizo la siguiente tabla:

CREATE TABLE `folders` (
`id` int(11) NOT NULL,
`previous` int(11) DEFAULT NULL,
`name` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
)

Como resulta evidente hay una foreign key entre files.folder y folders.id y otra entre folders.id y folders.previous

La idea es que al crear el archivo se pueda seleccionar como carpeta cualquier entrada de la tabla folders o NULL. Si es NULL, el archivo se encontraría en la raiz del sistema.
Del mismo modo si el campo 'previous' de la carpeta fuese NULL significa que la carpeta se encuentra en la raiz del sistema; y si indica un id, se encuentra dentro de la carpeta con ese id.

De este modo podría tener las siguientes entradas en folders:

INSERT INTO `folders` (`id`, `previous`, `name`) VALUES
(1, NULL, 'Carpeta 1'),
(2, 1, 'Subcarpeta para 1'),
(3, NULL, 'Carpeta 2'),
(4, 2, 'Sub sub carpeta de 1');

Bien, lo que quiero conseguir es una consulta que me devuelva el árbol de carpetas y su id, es decir, todas las carpetas con subcarpetas. Para el ejemplo anterior sería algo como:

1 /Carpeta 1
2 /Carpeta 1/Subcarpeta para 1
4 /Carpeta 1/Subcarpeta para 1/Sub sub carpeta de 1
3 /Carpeta 2

Para ello lo único que se me ocurre es formar un bucle de consultas que en caso de que previous sea distinto de NULL haga una consulta a ese id para averiguar su name y su previous y así sucesivamente hasta que sea distinto de NULL. Pero no tengo ni la menor idea de como lograrlo en MYSQL, y obviamente no lo quiero hacer en PHP...
Alguien sería tan amable de ayudarme Muchas gracias