MySQL - consulta con inner join

 
Vista:
Imágen de perfil de Hfr
Val: 26
Ha disminuido su posición en 5 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

consulta con inner join

Publicado por Hfr (21 intervenciones) el 05/04/2016 15:30:43
Hola chicos tengo esta consulta que hice con inner join

SELECT dg.*, acom.*, amf.*, ami.*, ams.*, fm.* FROM nnja dg
INNER JOIN acompanamiento acom on dg.cod_nnja= acom.cod_nnja_acompa
INNER JOIN ambito_familiar amf on dg.cod_nnja = amf.cod_nnja_amito_fa
INNER join ambito_individual ami on dg.cod_nnja = ami.cod_nnja_ambito
INNER JOIN ambito_social ams on dg.cod_nnja =ams.cod_nnja_ambito_social
INNER join ambiente_familia_sos fm on dg.cod_nnja = fm.cod_nnja_amfm_sos



la consulta funciona.
resulta que la tabla nnja tengo como 100 registros , y en las otras tablas tengo como 5 registros máximo en cada tabla
entonces hay una id 10 dígitos que tiene en común todas las tablas.
de esta forma el me trae todos los registros que tiene el id de 10 dígitos , pero solo me trae aquellos id que se encentran en todas las tablas.
hay varios id que no se encuentran en todas las tablas y eso nos los muestra en la consulta.

supongamos que la tabla con el alias amf tiene registro con un id 10 dígitos que aparece en el tabla con el alias dg pero ese id no esta en las otras tablas porque no se ha ingresado a un, la consulta debería traerme todos los datos de dg y de amf y el resto de los campos de las otras tablas restantes debiera de mostrarlos como vacíos . alguien me pude dar una mano.....
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: 20
Ha disminuido su posición en 25 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

consulta con inner join

Publicado por Gonzalo (103 intervenciones) el 06/04/2016 03:11:23
1
2
pero solo me trae aquellos id que se encentran en todas las tablas.
hay varios id que no se encuentran en todas las tablas y eso nos los muestra en la consulta.
Bueno, ese es el comportamiento normal y esperado de un INNER JOIN
El INNER JOIN es mandatorio. Sólo devuelve lo que cumple todas las condiciones.

Si tienes relaciones OPCIONALES, estas deben definirse por medio de LEFT JOIN, no de INNER.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Hfr
Val: 26
Ha disminuido su posición en 5 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

consulta con inner join

Publicado por Hfr (21 intervenciones) el 06/04/2016 16:04:47
Hola gonzalo, si parece que solo con inner no basta


SELECT dg.nombre, dg.apellido, acom.*, amf.*, ami.*, ams.*, fm.* FROM nnja dg
LEFT JOIN acompanamiento acom on dg.cod_nnja= acom.cod_nnja_acompa

LEFT JOIN ambito_familiar amf on dg.cod_nnja = amf.cod_nnja_amito_fa
LEFT join ambito_individual ami on dg.cod_nnja = ami.cod_nnja_ambito
LEFT JOIN ambito_social ams on dg.cod_nnja =ams.cod_nnja_ambito_social
LEFT join ambiente_familia_sos fm on dg.cod_nnja = fm.cod_nnja_amfm_sos

UNION ALL

SELECT dg.nombre, dg.apellido, acom.*, amf.*, ami.*, ams.*, fm.* FROM nnja dg
RIGHT JOIN acompanamiento acom on dg.cod_nnja= acom.cod_nnja_acompa

RIGHT JOIN ambito_familiar amf on dg.cod_nnja = amf.cod_nnja_amito_fa
RIGHT join ambito_individual ami on dg.cod_nnja = ami.cod_nnja_ambito
RIGHT JOIN ambito_social ams on dg.cod_nnja =ams.cod_nnja_ambito_social
RIGHT join ambiente_familia_sos fm on dg.cod_nnja = fm.cod_nnja_amfm_sos



realice una union porque Mysql no toma el full join,
toma tres registros y los muestra aparentemte bien, pero con el resto arroja null null null jejeje.
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: 20
Ha disminuido su posición en 25 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

consulta con inner join

Publicado por Gonzalo (103 intervenciones) el 06/04/2016 22:09:09
No pongas LEFT y RIGHT sin ton ni son. No es una cláusula mágica que te devolverá cualquier cosa.
Lo que tienes que hacer es ANALIZAR cuáles son las relaciones opcionales, y sólo aplicar LEFT JOIN en aquellas donde realmente puedan no presentarse registros vinculados a la relación padre.
La relación padre NO debe llevar LEFT ni RIGHT. Es decir, si dos o más tablas se relacionan en forma OBLIGATORIA, siempre tendrán los registros. Es sobre las opcionales que necesitas el LEFT JOIN.

Pero: Ten en cuenta que aquella tabla donde no haya relaciones devolverá SIEMPRE NULL. Es parte de la definición del SQL.

No te puedo dar un ejemplo con tu query, porque no conozco cual es la obligatoriedad de los datos que tienes definidos en TU base. Eso sólo lo sabes tu.
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