Consulta sql cuando dos campos de una tabla hacen referencia a un mismo campo de otra tabla.
La situación es la siguiente, tengo dos tablas, en una de ellas tengo dos campos que almacenan el índice en la otra tabla, ambos campos pueden ser distintos entre sí, iguales o bién el segundo puede estar vacío (ser nulo).
Para que se entienda mejor la situación planteo un ejemplo de esta situación.
Se tiene una tabla de usuarios que consta de ID, Nombre y Apellido. Se tiene otra tabla que almacena los archivos que se subieron al servidor donde se registra ID del archivo, su nombre, el id del usuario que lo subió y eventualmente el id del usuario que lo bajó:
Código MySQL :
-- Estructura de tabla para la tabla `usuarios` CREATE TABLE IF NOT EXISTS `usuarios` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(20) NOT NULL, `apellido` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- Volcar la base de datos para la tabla `usuarios` -- INSERT INTO `usuarios` (`id`, `nombre`, `apellido`) VALUES (1, 'Juan', 'Parez'), (2, 'María', 'Lopez');
Código MySQL :
-- Estructura de tabla para la tabla `archivos` -- CREATE TABLE IF NOT EXISTS `archivos` ( `idarchivo` int(11) NOT NULL AUTO_INCREMENT, `nombrearchivo` varchar(100) NOT NULL, `usuariosubida` int(11) NOT NULL DEFAULT '0', `usuariobajada` int(11) NOT NULL DEFAULT '0', `fechasubida` datetime NOT NULL, `fechabajada` datetime NOT NULL, PRIMARY KEY (`idarchivo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- Volcar la base de datos para la tabla `archivos` -- INSERT INTO `archivos` (`idarchivo`, `nombrearchivo`, `usuariosubida`, `usuariobajada`, `fechasubida`, `fechabajada`) VALUES (1, 'imagen1.jpg', 1, 2, '2010-10-01 10:34:55', '2010-10-27 10:34:59'), (2, 'comprimido1.zip', 2, 1, '2010-10-08 10:35:18', '2010-10-24 10:35:21');
Entonces pretendo obtener una lista de todos los archivos reemplazando los campos "usuariosubida" y "usuariobajada" de la tabla 'archivos' por su correspondientes "nombre" y "apellido" de la tabla 'usuarios'.
Esto es lo que hago:
Código MySQL :
SELECT `usr1`.*, `usr2`.*, `archivos`.* FROM `archivos` INNER JOIN `usuarios` AS `usr1` ON `archivos`.`usuariosubida` = `usr1`.`id` INNER JOIN `usuarios` AS `usr2` ON `archivos`.`usuariobajada` = `usr2`.`id`
Y funciona, ya que me devuelve lo que espero me devuelva.
El problema surge cuando el campo "usuariobajada" es nulo, vale cero o no corresponde con ningún id de la tabla 'usuario', esto ocurre cuando el archivo en cuestión aún no fue descargado por nadie.
Código MySQL :
INSERT INTO `test`.`archivos` (`idarchivo` ,`nombrearchivo` ,`usuariosubida` ,`usuariobajada` ,`fechasubida` ,`fechabajada` ) VALUES (NULL , 'presentacion1.ppt', '1', '0', '2010-10-28 11:16:49', '0000-00-00 00:00:00' );
En ese caso pues no aparece ese nuevo archivo.
Intenté lo siguiente:
Código MySQL :
SELECT `usr1`.*, `usr2`.*, `archivos`.* FROM `archivos` INNER JOIN `usuarios` AS `usr1` ON `archivos`.`usuariosubida` = `usr1`.`id` OUTER JOIN `usuarios` AS `usr2` ON `archivos`.`usuariobajada` = `usr2`.`id`
Pero MySQL se me queja diciéndome que tengo un error en OUTER JOIN ¿por qué?.
Concretamente el error es:
Código :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN `usuarios` AS `usr2` ON `archivos`.`usuariobajada` = `usr2`.`id` LI' at line 4
I need some help, gracias