Comunidad de diseño web y desarrollo en internet online

OUTER JOIN de campos de una tabla a índice de otra.

Citar            
MensajeEscrito el 25 Oct 2010 02:24 pm
Tengo el siguiente problema que paso a detallar.

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 :)

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 25 Oct 2010 07:29 pm
En MySQL OUTER no se usa solo, se usa en conjunto con LEFT y RIGHT si se desea compatibilidad con ODBC.

Para MySQL LEFT OUTER y LEFT es lo mismo. Lo propio aplica para RIGHT

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 25 Oct 2010 08:44 pm
Pero si soy el rey de los huevones!
Es así:

Código MySQL :

SELECT `usr1`.*, `usr2`.*, `archivos`.*
FROM `archivos`
INNER JOIN `usuarios` AS `usr1` ON `archivos`.`usuariosubida` = `usr1`.`id`
LEFT JOIN `usuarios` AS `usr2` ON `archivos`.`usuariobajada` = `usr2`.`id`


MySQL no tiene OUTER. Es lo que pasa cuando tienes varios dialectos en la cabeza.

Gracias Maikel.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.