MySQL - Ayuda con consulta mutitablas

 
Vista:
Imágen de perfil de Claudio Gonzalez

Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 03/11/2010 22:40:11
Hola Que tal.

Tengo el siguiente problema, en una consulta multitablas, cuando agrego un ON o un Where, no muestra los datos, para ver si alguien me puede ayudar dejo el código a continuación.

<?php
include('conexion.class.php');

$sql=" SELECT
mov.rut_trabajador,
tra.rut,
tra.rut_empresa,
emp.nombre,
tra.nombre,
tra.apellidos

FROM ge_movimientos AS mov,
ge_trabajador AS tra,
ge_empresas AS emp

ON ge_movimientos.rut_trabajador = ge_trabajador.rut";

$res=mysql_query($sql,Conectar::con());
While ($row=mysql_fetch_array($res))
{
echo "Rut Trabajador : ", $row[0], " Nombre : ", $row[4]," ". $row[5];
echo "<br />";
echo "Rut Empresa : ", $row[2], " Empresa : ", $row[3];
echo "<br />";
}

?>

Si saco el ON me entrega los datos repetidos, si pongo el ON o WHERE no muestra nada.
Estaré muy agradecido si alguien me puede ayudar, además que tengo que agregar otras tablas y otros datos, pero mientras no resuelva esto no quiero seguir con los demaś.

De antemano mil Gracias
Un Cordial saludo desde Valparaíso - Chile
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 03/11/2010 23:49:41
Buenas tardes Claudio:

Primero que nada, estás mezclando dos maneras de hacer union entre tablas, pero ambas están erroneas.

Sin utilizar JOIN

FROM ge_movimientos mov,
ge_trabajador tra,
ge_empresas emp
WHERE
mov.rut_trabajador = tra.rut and
--Aquí faltaría determinar cuál es el campo por el que se relacionan las
--tablas ge_trabajador y ge_movimientos con la tabla ge_empresa.

UTILIZANDO JOIN
FROM ge_movimientos mov
INNER JOIN ge_trabajador tra ON mov.rut_trabajador = tra.rut
INNER JOIN ge_empresas emp ON
--Aquí faltaría determinar cuál es el campo por el que se relacionan las
--tablas ge_trabajador y ge_movimientos con la tabla ge_empresa.

En lo particular de recomiendo utilizar JOIN'S para hacer tus uniones, pues mejoran considerablemente el desempeño de las consultas.

Saludos.
Leo.
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 04/11/2010 00:21:29
Gracias Leo por tu respueta.

Gice lo que me indicaste, quedando la consulta de la siguiente forma :
<?php
include('conexion.class.php');

$sql=" SELECT
tra.rut,
tra.nombre,
tra.apellidos,
tra.rut_empresa,
emp.nombre
FROM
ge_trabajador tra INNER JOIN
ge_empresas emp ON tra.rut_empresa = emp.rut ";

$res=mysql_query($sql,Conectar::con());
While ($row=mysql_fetch_array($res))
{
echo "Rut Trabajador : ", $row[0], " Nombre : ", $row[1]," ". $row[2];
echo "<br />";
echo "Rut Empresa : ", $row[3], " Empresa : ", $row[4];
echo "<br />";
}

?>
y no entrega ningún resultado.
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 04/11/2010 16:03:01
Hola de nuevo Claudio, la consulta no tiene nada de malo, por lo que tengo que deducir entonces que el problema está en los datos, aquí lo único que se me ocurre es que tus campos ge_trabajado.rut_empresa y ge_empresas.rut puedan sean de tipo varchar o char y tengan una longitud diferente... En lo particular también he tenido problemas por espacios en blanco al inicio o final de las cadenas.

Revisa tu información para ver si es algo de esto, y si continuas con problemas lo comentas en el foro para ver qué más puede ser.

Saludos.
Leo
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 04/11/2010 20:29:49
Gracias ya lo estoy solucionando, no es lo que dices, pero ya voy encaminado
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 05/11/2010 16:50:14
Hola Claudio, si ya solucionaste tu problema sería conveniente que compartieras la solución con el foro, por si alguien más tiene el mismo problema en el futuro no crees???

Saludos.
Leo.
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 06/11/2010 19:43:02
El código quedó de la siguiente forma:

$sql=" SELECT
mov.rut_trabajador,
tra.rut,
tra.rut_empresa,
tra.nombre,
tra.apellidos
FROM
ge_trabajador tra INNER JOIN
ge_movimientos mov ON tra.rut = mov.rut_trabajador ";

Gracias por toda la ayuda prestada.
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 09/11/2010 14:39:15
Despues de agregar unos datos, nuevamente no resulta la consulta, por favor si alguien me puede explicar, he buscado información y no logro entender, he seguido los parametros que se indican, pero al ser mas tablas de las que muestran los ejemlos no se donde esta e problema.
Dejo el nuevo código a continuación.

<?php
include('conexion.class.php');
$sql=" SELECT
mov.rut_trabajador,
mov.cod_haber,
mov.cod_descuento,
mov.mes,
mov.anio,
tra.rut,
tra.nombre,
tra.apellidos,
tra.rut_empresa,
tra.cod_cargo,
tra.cod_afp,
tra.cod_salud,
emp.rut,
emp.nombre,
car.codigo,
car.nombre,
car.sueldo_base,
afp.codigo,
afp.nombre,
sal.codigo,
sal.nombre

FROM
ge_movimientos mov INNER JOIN
ge_trabajador tra ON mov.rut_trabajador = tra.rut INNER JOIN
ge_empresas emp ON emp.rut = tra.rut_empresa INNER JOIN
ge_cargos car, /* Si yo quito la coma y pongo un nuevo ON tra.cod_cargo = car.codigo ya no muestra nada */
ge_afps afp,
ge_salud sal,
ge_haber hab,
ge_descuentos des ";
/* ahora sin el ultimo ON me muestra todos los datos que necesito, pero muestra 48 veces los registros, en circunstancias que debiera mostrar solo 2. */

$res=mysql_query($sql,Conectar::con());

While ($row=mysql_fetch_array($res))
{
echo " Rut Trabajador : ", $row[0], " Nombre : ", $row[6]," ". $row[7];
echo "<br />";
echo " Rut Empresa : ", $row[8], " Empresa : ", $row[13];
echo "<br />";
echo " Cod. Cargo : ", $row[9], " Cargo : ", $row[15];
echo " Sueldo Base : ", number_format($row[16],2,',','.');
echo "<br />";
echo " Cod. AFP : ", $row[17];
echo " AFP : ", $row[18];
echo " Cod. Salud : ", $row[19];
echo " Salud : ", $row[20];
echo "<br />";
echo " Haber : ", $row[1];
echo " Descuentos : ", $row[2];
echo " FECHA : ", $row[3],"-",$row[4];
echo "<br />";
echo "<hr />";
}
?>

Cualquier Ayuda sera muy bien venida.

Un Cordial saludo desde Valparaíso - Chile
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 09/11/2010 23:48:15
Si dices que al poner una condición ON no te aparece ningún registro es porque definitivamente no existe ningún par de registros que puedan igualarse... por lo que el problema está entonces en los datos...

En caso de mostrar registros duplicados es porque se está realizando un producto cartesiano entre dos tablas por lo que hay que agregar la condición de unión respectiva.

Como nota adicional, otra vez estás mezclando dos tipos de unión entre tablas y creo que es justamente el problema, en el primer post que te escribí te explicaba la forma en que se pueden hacer las uniones entre las tablas, de tal manera que utilizas INNER JOIN para todas tus tablas o para ninguna y haces las uniones en la sección del WHERE

Leo
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 10/11/2010 00:54:38
Gracias Leonardo.

Comprendo perfectamente lo que me dices, solo que las lineas que estan despues de los ON, son de prueba, para saber que paaba, ahora hice lo siguiente y no me muestra datos, en circunstancias que si hay y te voy explicar mejor despues del código que voy a dejar a continuación.

<?php
include('conexion.class.php');

$sql=" SELECT
mov.rut_trabajador,
mov.cod_haber,
mov.cod_descuento,
mov.mes,
mov.anio,
tra.rut,
tra.nombre,
tra.apellidos,
tra.rut_empresa,
tra.cod_cargo,
tra.cod_afp,
tra.cod_salud,
emp.rut,
emp.nombre,
car.codigo,
car.nombre,
car.sueldo_base

FROM
ge_movimientos mov
INNER JOIN ge_trabajador tra ON mov.rut_trabajador = tra.rut
INNER JOIN ge_empresas emp ON emp.rut = tra.rut_empresa
INNER JOIN ge_cargos car ON car.codigo = tra.cod_cargo

";

$res=mysql_query($sql,Conectar::con());

While ($row=mysql_fetch_array($res))
{
echo " Rut Trabajador : ", $row[0], " Nombre : ", $row[6]," ". $row[7];
echo "<br />";
echo " Rut Empresa : ", $row[8], " Empresa : ", $row[13];
echo "<br />";
echo " Cod. Cargo : ", $row[9], " Cargo : ", $row[15];
echo " Sueldo Base : ", number_format($row[16],2,',','.');
echo "<br />";
echo " Cod. AFP : ", $row[17];
echo " AFP : ", $row[18];
echo " Cod. Salud : ", $row[19];
echo " Salud : ", $row[20];
echo "<br />";
echo " Haber : ", $row[1];
echo " Descuentos : ", $row[2];
echo " FECHA : ", $row[3],"-",$row[4];
echo "<br />";
echo "<hr />";
}

?>

Hasta el segundo INNER JOIN funciona bien, muestra 2 tuplas o registros, al poner el tercer INNER JOIN, ya no muestra nada,
La tabla ge_cargos tiene 4 registros en ellos figura un código 0102 y 010.
En la tabla ge_trabajador hay 2 registros en los cuales figura el cod_cargo 0102 y el cod_cargo 010, entonces aqui es donde tu me dices que si no muestra nada es porque no hay nada que coincida con la consulta, y yo digo que si hay, como te explico.

Si te fja en los datos que quiero mostrar todavia me falta que agregar datos y tablas a la consulta y estoy parado ahi, sin saber que hacer, y creo tambien que ahora no esta mezclado el código, ¿verdad? .

Muchas gracias de todas maneras por la ayuda que me has proporcionado, he buscado bastante en los manuales de Mysql, en San Google, pero a verdad que siempre salen ejemplos a lo mas con 3 tablas, nada mas.
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

RE:Ayuda con consulta mutitablas

Publicado por martin (150 intervenciones) el 10/11/2010 15:40:50
para probar no uses INNER JOIN usa LEFT JOIN(o RIGHT JOIN segun sea el caso) y donde te muestre campos null esos son los que no machean y para descartar algun problema con php realiza la consulta en la consola o con algun gestor de bd de mysql.

saludos.
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 10/11/2010 16:42:40
Tal como recomienda martín convendría en primer lugar determinar donde está el problema, si con MySQL o con PHP,

De lo que comentas acerca de los datos, al manejar lo siguiente códigos como 0102 puedo suponer que estás manejando los campos como tipo cadena (para poder agregar ceros a la izquierda). en los primeros post que te escribí te comentaba algunos aspectos que hay que cuidar:

1. Verificar que el tipo de dato de las columnas sea el mismo y que tengan la misma dimensión
2. Verificar que no existan espacios en blanco al inicio o fin de cada uno de los campos
3. Revisar que las tablas tengan el mismo COLLATE.

También te convendría ir revisando cada tabla a ver si las consultas regresan resultados:

select * from ge_cargos where codigo in ('0102', '010')

select * from ge_trabajador where cod_cargo in ('0102', '010')

select * from ge_cargos T1 inner join ge_trabajador T2
on T1.codigo = T2.cod_cargo
where T1.codigo in ('0102', '010')

Saludos
Leo.
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
Imágen de perfil de Claudio Gonzalez

RE:Ayuda con consulta mutitablas

Publicado por Claudio Gonzalez (19 intervenciones) el 11/11/2010 00:38:13
Gracias Martin y Leonardo.

Por fin, sin su ayuda creo que no iba a descubrir nunca el inconveniente. Muchas Gracias

Era eso de los Collate, habían unos utf8_spanish2_ci y otros utf8_spanish_ci, los deje todos iguales y se solucionó todo.

Ahora puedo usar LET INNER o RIGHT y todo marcha bien.
La consulta de ejemplo que me dio Leonardo,

select * from ge_cargos T1 inner join ge_trabajador T2
on T1.codigo = T2.cod_cargo
where T1.codigo in ('0102', '010')

Me dio error de COLLATE y eso me hizo revisar las tablas

Por otro lado, Leonardo o Martin, que tipo de campo me recomiendan para ponerle a los código, vengo de utilizar Visual Foxpro y ahí aprendí que los campos que no fueran ser usados para alguna operación de calculo era mejor usar caracteres, por ello no uso un campo de numero, pero si me recomiendan cual usar se los agradezco enormemente.

Muchas Gracias nuevamente.
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

RE:Ayuda con consulta mutitablas

Publicado por martin (150 intervenciones) el 11/11/2010 02:39:48
Los campos que intervienen en los joins son,por lo general, claves primarias en sus respectivas entidades y por tanto deben estar indexadas etc. con lo cual lo mas optimo es usar tipos de datos numéricos, ya que ocupan menos espacio que una cadena y son mas simples para indexar etc, hora si la normalizacion te dicta otra cosa, esta en el profesional de sistemas evaluar si es conveniente aplicarla o no y definir una alternativa.

Saludos.
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

RE:Ayuda con consulta mutitablas

Publicado por Leonardo Josué (414 intervenciones) el 11/11/2010 22:56:27
Nada que agregar al comentario de Martín, es exactamente lo que iba a comentar...

Me alegro que al fin hayas dado con el error.

Saludos.
Leo.
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