MySQL - PROBLEMAS CON INNER JOIN

 
Vista:
sin imagen de perfil

PROBLEMAS CON INNER JOIN

Publicado por Miguel (3 intervenciones) el 14/03/2010 00:42:20
Hola. mi problema es el siguiente: tengo dos tablas q quiero unir en un select
MOVIMIENTOS (Fechaingreso, Fechasalida, Origen y Destino) y DEPENDENCIAS (IdDep y dependencia) no vean al detalle porq solo estoy poniendo lo que interesa al problema, la cuestion en que tanto el campo Origen como el Destino de la tabla MOVIMIENTOS deben recoger el dato del campo dependencia de la tabla DEPENDENCIAS para eso hice este select.

$consulta = "SELECT expedientes.IdExpte, dependencias.IdDep, dependencias.dependencia, movimientos.IdMov, movimientos.IdExpte, expedientes.Numero, movimientos.FechaIng, movimientos.FechaSalida, movimientos.RespSalida, movimientos.Observaciones, movimientos.OrigenInt FROM dependencias INNER JOIN (expedientes INNER JOIN movimientos ON expedientes.IdExpte = movimientos.IdExpte) ON (movimientos.OrigenInt = dependencias.IdDep) AND (movimientos.DestinoInt = dependencias.IdDep) WHERE expedientes.Numero = '$_POST[numexpte]' GROUP BY movimientos.IdMov";

si se fijan antes de la clausula WHERE hay un ON que "enlaza" esos campos sin embargo cuando ejecuto la consulta el resultado es "vacio" ni siquiera eror. no muestra nada. en que me estoy equivocando por favor si alguien me puede ayudar.

si elimino uno de esas "igualdades" funciona, pero solo con el campo que queda. espero haberme explicado. saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PROBLEMAS CON INNER JOIN

Publicado por Gonzalo (339 intervenciones) el 14/03/2010 02:21:31
La consulta adolece de algunos problemas:
1) Es conveniente respetar en el orden de tablas, el orden de la jerarquía de relaciones: Si primero existe el EXPEDINETE, luego los MOVIMIENTOS y al final las DEPENDENCIAS, ese es el orden en que los INNER JOIN se deben poner. Alterar ese orden a veces, sobre todo con los LEFT/RIGHT JOIN producen resultados erróneos.
2) MySQL no toma bien colocar los ON de un conjunto de INNER JOINs al final de todos. Eso suele tomarse como error de sintaxis, por lo que es mejor ir declarando las relaciones en forma encadenada: Primer par + relación + tercera tabla + relación con tercera tabla, etc.
3) Según describes, tienes un sólo registro en MOVIMIENTOS relacionado con más de uno de DEPENDENCIAS, por lo que no se puede realizar un sólo INNER JOIN contra DEPENDENCIAS, ya que no hay un mismo registro en esa tabla que pueda corresponder a ambos valores (OrigenInt y DestinoInt ). Para resolver estos casos se debe realizar un INNER JOIN contra dos lecturas diferentes de DEPENDENCIAS, lo que se logra invocando dos veces la tabla pero asignándoles ALIAS distintos a cada una.
Para que se comprenda algo: La lógica de los parsers en el INNER JOIN es simple: Sólo devuelve un registro por cada coincidencia entre dos tablas en un valor dado. Pero no puede compararse el mismo campo contra dos campos diferentes, porque el resultado es autoexcluyente... La lógica en ese caso es un XOR, no un OR... ¿Se entiende?
4) El usar alias implica dos cosas: a) puedes abreviar la invocación de tablas con sus alias (facilita la lectura); b) Hay que definir bien qué valoes salen de qué tabla.

Limpiando un poco la basura, quedó así:
SELECT
E.IdExpte,
D1.IdDep,
D1.dependencia,
M.IdMov,
M.IdExpte,
E.Numero,
M.FechaIng,
M.FechaSalida,
M.RespSalida,
M.Observaciones,
M.OrigenInt
FROM movimientos M INNER JOIN expedientes E USING(IdExpte)
INNER JOIN dependencias D1 ON M.OrigenInt = D.1IdDep
INNER JOIN dependencias D2 ON M.DestinoInt = D2.IdDep
WHERE E.Numero = numexpte
GROUP BY M.IdMov;

Hay pue probar, para ver si hay que hacer algún ajuste todavía.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar