Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda con el Left Join

Estas en el tema de Ayuda con el Left Join en el foro de Mysql en Foros del Web. Hola hace un par de dias me fue de gran ayuda una aclaracion y desde ahi he comenzado a utilizar Left Join para simplificar mis ...
  #1 (permalink)  
Antiguo 30/03/2009, 04:59
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 65
Antigüedad: 21 años
Puntos: 2
Ayuda con el Left Join

Hola hace un par de dias me fue de gran ayuda una aclaracion y desde ahi he comenzado a utilizar Left Join para simplificar mis consultas.

ahora bien les dejo con un problemilla que me ha surgido:

Esta sentencia funciona perfectamente.

Código:
SELECT * FROM F_CLI LEFT JOIN F_AMB USING (CODCLI)
WHERE F_CLI.CODCLI=147
ahora bien cunado intento asociar una tercera tabla ya el resultado no es el deseado lo hago así (que de seguro esta mal, aunque garantizo haberlo intentado empollando el manual de Mysql)

Código:
SELECT * FROM F_CLI a LEFT JOIN F_AMB b,F_CLIAMP c USING (CODCLI) 
WHERE a.CODCLI=147
Si alguien me hecha un cable (y no para ahoracrme jajajja)
Gracias de antemano..
  #2 (permalink)  
Antiguo 30/03/2009, 05:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con el Left Join

Ahí va este cable (espero que no sea para lo que dices). Estás cruzando la tabla f_cli con las tablas f_amb y f_cliamp, a su vez en un cruce natural, usando para ello codcli, que no sé si estará en las tres tablas. Deberías unir las tres tablas con dos left join (habría que ver) usando los campos relacionados entre cada dos: no sé cuál es el campo que sirve para cruzar f_amb y f_cliamp.
Para ayudarte deberíamos saber cómo están relacionadas y los datos que quieres mostrar de cada una, si todos o sólo los que estén relacionados.
Dinos eso y te haremos alguna propuesta.
  #3 (permalink)  
Antiguo 30/03/2009, 08:01
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 65
Antigüedad: 21 años
Puntos: 2
Respuesta: Ayuda con el Left Join

Perdon por la falta de informacion, me explico mejor, para empezar las tablas no estan relacionadas (es decir no existen relaciones entre ellas).

Las tablas son:

F_CLI que contiene entre otros
NOCCLI -> nombre del cliente
CODCLI -> codigo del cliente (este es el puente de union).

F_AMB....que contiene...
CODCLI -> codigo del cliente.
PRO1 -> ambito de provincia 1

F_CLIAMP....que contiene
CODCLI -> codigo de cliente.
MAILCLI -> correo electronico.

la idea es hacer una sola consulta a la tabla F_CLI y que esta consulta arrastre los valores coincidentes en las tablas F_AMB y F_CLIAMP es decir que muestre los valores donde F_CLI.CODCLI = 147 (por ejemplo) conteniendo los campos de las tablas F_CLI, F_AMB, F_CLIAMP.

Espero esta vez haber sido mas claro, y gracias.
  #4 (permalink)  
Antiguo 30/03/2009, 14:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con el Left Join

SELECT fc.NOCCLI, fc.CODCLI, fa.PRO1, fcl.MAILCLI FROM F_CLI fc INNER JOIN F_AMB fa USING (CODCLI) INNER JOIN F_CLIAMP fcl USING (CODCLI)
Esto te mostrará todos los clientes que tienen un ámbito de provincia y que tienen un correo electrónico. Pero tal vez quieras mostrar todos los clientes, tengan o no ámbito de provincia, y tengan o no correos.

SELECT fc.NOCCLI, fc.CODCLI, fa.PRO1, fcl.MAILCLI FROM F_CLI fc LEFT JOIN F_AMB fa USING (CODCLI) LEFT JOIN F_CLIAMP fcl USING (CODCLI)
Esta consulta te mostrará NULL en los cruces donde no halla datos, es decir, en los campos de F_AMB para aquellos clientes cuyo CODCLI no aparezca recogido en esa tabla, un también en aquellos de campos de la tabla F_CLIAMP que no están relacionados con F_AMB.

Mira qué es exactamente lo que quieres sacar y podremos precisarte más. Espero haberte entendido.
  #5 (permalink)  
Antiguo 08/04/2009, 08:46
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 65
Antigüedad: 21 años
Puntos: 2
Respuesta: Ayuda con el Left Join

Gracias jurena, me ha quedado así:

SELECT * from F_CLI a LEFT JOIN F_AMB b USING(CODCLI) LEFT JOIN F_CLIAMP c USING(CODCLI) WHERE 1

esto me muestra todos los clientes de la tabla F_CLI tengan o no asociados datos en las tablas F_AMB y F_CLIAMP.

Ahora en el resultado me aparecen 3 CODCLI 1 por cada tabla como saber que me devuelve si escribo en un campo del formulario $row[CODCLI], donde $row es el resultado del SELECT realizado desde PHP.

Gracias de antemano!!!
  #6 (permalink)  
Antiguo 08/04/2009, 08:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con el Left Join

No uses SELECT * pues es un desperdicio. Por otra parte cuando tengas campos con un mismo nombre en distintas tablas deberás usar alias para recuperarlos. Por ejemplo SELECT fc.CODCLI codcli1, fa.CODCLI codcli2, fcl.CODCLI codcli3 FROM ....
y luego recuperas esos alias como nombres de campo.
Pero para tu caso, evita traerte todos los campos. Usa esto:
SELECT fc.NOCCLI, fc.CODCLI, fa.PRO1, fcl.MAILCLI FROM F_CLI fc LEFT JOIN F_AMB fa USING (CODCLI) LEFT JOIN F_CLIAMP fcl USING (CODCLI)

ahora sólo tendrás un CODCLI, el de la tabla F_CLI, y podrás recuperarlo con tu programa. Si necesitas añadir más campos, añádelos con su alias correspondiente de tabla.
  #7 (permalink)  
Antiguo 08/04/2009, 09:26
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 65
Antigüedad: 21 años
Puntos: 2
Respuesta: Ayuda con el Left Join

Gracias por el consejo, utilizo select * porque intento mostrar todos los datos en la ficha del ciente es por eso que quiero recoger los datos de todas las tablas en una sola consulta, pero ante tu sugerencia se me ocurre una preunta puedo recoger solo los que no sean NULL.

Eso ya sería la ostia!!!

Gracias de nuevo
  #8 (permalink)  
Antiguo 09/04/2009, 02:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con el Left Join

Perdón, he repetido el mensaje. Mira el siguiente
  #9 (permalink)  
Antiguo 09/04/2009, 02:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con el Left Join

No creo que tengas necesidad de traerte todo: pues ese asterisco se trae todos los campos de las tres tablas, y uno de ellos al menos lo tendrás en las tres. De todas formas, es ese asterisco el que te impide usar los alias que necesitas, pues al hacer el cruce con el mismo nombre en tres campos y seleccionando todo con el asterisco el programa no sabe qué devolverte.
En cuanto a lo segundo:
claro que sí,

SELECT fc.NOCCLI, fc.CODCLI, fa.PRO1, fcl.MAILCLI FROM F_CLI fc LEFT JOIN F_AMB fa USING (CODCLI) LEFT JOIN F_CLIAMP fcl USING (CODCLI) WHERE tabla.nombrecampo IS NULL


SELECT fc.NOCCLI, fc.CODCLI, fa.PRO1, fcl.MAILCLI FROM F_CLI fc LEFT JOIN F_AMB fa USING (CODCLI) LEFT JOIN F_CLIAMP fcl USING (CODCLI) WHERE tabla.nombrecampo IS NULL OR tabla.nombreotrocampo IS NULL

Pero si quieres excluir todos los null estás haciendo realmente un inner join como el primero. Otra cosa, puedes usar IFNULL() para poner un mensaje cuando el campo tenga null. Mira cómo funciona por si es de tu interés.

Dinos qué datos quieres evitar (de qué tabla, bajo qué criterio) y te ayudaremos a preparar la consulta, pues, como puedes imaginar, podrías utilizar left join en un cruce e inner join en otro, pero eso depende de lo que quieras sacar.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:39.