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

Ayuda con consulta JOIN

Estas en el tema de Ayuda con consulta JOIN en el foro de Mysql en Foros del Web. Hola. Tengo unas tablas encabezado_factura y otra llamada cliente en donde ambas estan relacionadas quedando el campo rut_cliente como FK en la tabla encabezado factura. ...
  #1 (permalink)  
Antiguo 14/12/2009, 10:24
Avatar de Capote  
Fecha de Ingreso: julio-2007
Ubicación: C h i l e
Mensajes: 136
Antigüedad: 16 años, 9 meses
Puntos: 0
Ayuda con consulta JOIN

Hola.
Tengo unas tablas encabezado_factura y otra llamada cliente en donde ambas estan relacionadas quedando el campo rut_cliente como FK en la tabla encabezado factura. Yo por medio de JOIN puedo consultar los datos de la tabla cliente sin problemas, pero resulta que en esa tabla cliente esta los campos id_comuna y id_ciudad (que son nunmerico 1,2,3,..N) que son FK y vienen de la relacion con las tablas cliente con comunas y ciudad.
Yo cuando los consulto por me trae esos valores numericos y yo deseo mostrar el campo descripcion_comuna y descripcion_ciudad que son sus nombres y no se como hacerlo.

Asi lo estoy haciendo hasta ahora:

Código MySQL:
Ver original
  1.                 ef.numero_factura,
  2.                 ef.fecha_factura,
  3.                 (SELECT CONCAT(rut_cliente,"-",dv_cliente)  FROM cliente c where c.rut_cliente = ef.rut_cliente),
  4.                 (SELECT c.giro_cliente  FROM cliente c where c.rut_cliente = ef.rut_cliente),
  5.                 (SELECT c.direccion_cliente  FROM cliente c where c.rut_cliente = ef.rut_cliente),
  6.                 (SELECT c.id_comuna FROM cliente c where c.rut_cliente = ef.rut_cliente),
  7.                 (SELECT c.id_ciudad FROM cliente c where c.rut_cliente = ef.rut_cliente),
  8.                 cf.linea_factura,
  9.                 cf.id_contrato_cliente,
  10.                 cf.cantidad,
  11.                 cf.descuento,
  12.                 cf.precio_unitario,
  13.                 pf.valor_neto,
  14.                 pf.valor_iva,
  15.                 pf.valor_bruto,
  16.                 pf.total_descuento
  17.  
  18.                 from encabezado_factura ef
  19.                 JOIN cuerpo_factura cf using (numero_factura)
  20.                 JOIN pie_factura pf using (numero_factura)

En la linea nº 7 y 8 tengo que mostrar el campo descripcion_comuna y descripcion_ciudad.

Gracias!
__________________
"La blanda respuesta quita la ira, Mas la palabra áspera hace subir el furor"
  #2 (permalink)  
Antiguo 14/12/2009, 11:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con consulta JOIN

Suponiendo la existencia de dos tablas comuna y ciudad, la cosa andaría por aquí:
Código MySQL:
Ver original
  1.   ef.numero_factura,
  2.   ef.fecha_factura,
  3.   (CONCAT(c.rut_cliente,"-",c.dv_cliente) rut_dv_cliente,
  4.   c.giro_cliente,
  5.   c.direccion_cliente,
  6.   c.nombre_comuna,
  7.   c.nombre_ciudad,
  8.   cf.linea_factura,
  9.   cf.id_contrato_cliente,
  10.   cf.cantidad,
  11.   cf.descuento,
  12.   cf.precio_unitario,
  13.   pf.valor_neto,
  14.   pf.valor_iva,
  15.   pf.valor_bruto,
  16.   pf.total_descuento
  17. FROM encabezado_factura ef
  18.   INNER JOIN cuerpo_factura cf USING (numero_factura)
  19.   INNER JOIN pie_factura pf USING (numero_factura)
  20.   INNER JOIN cliente c USING(rut_cliente)
  21.   LEFT JOIN comuna co ON co.id_comuna = c.id_comuna
  22.   LEFT JOIN ciudad ci ON ci.id_ciudad = c.id_ciudad;
Estoy suprimiendo las subconsultas en el SELECT porque esos datos deben obtenerse del FROM, de lo contrario la consulta será MUY ineficiente.
Esto puede requerir algun ajuste, conforme sean los datos y las tablas que tu tengas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/12/2009, 12:37
Avatar de Capote  
Fecha de Ingreso: julio-2007
Ubicación: C h i l e
Mensajes: 136
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta JOIN

Hola.
Aplique los cambios que me menciona y luego de unos ajustes, resulto como queria mostrar los datos.

Asi deje mi consulta

Código MySQL:
Ver original
  1.   ef.numero_factura,
  2.   ef.fecha_factura,
  3.   CONCAT(c.rut_cliente,"-",c.dv_cliente),
  4.   c.giro_cliente,
  5.   c.direccion_cliente,
  6.   co.descripcion_comuna,
  7.   ci.descripcion_ciudad,
  8.   cf.linea_factura,
  9.   cf.id_contrato_cliente,
  10.   cf.cantidad,
  11.   cf.descuento,
  12.   cf.precio_unitario,
  13.   pf.valor_neto,
  14.   pf.valor_iva,
  15.   pf.valor_bruto,
  16.   pf.total_descuento
  17. FROM encabezado_factura ef
  18.   INNER JOIN cuerpo_factura cf USING (numero_factura)
  19.   INNER JOIN pie_factura pf USING (numero_factura)
  20.   INNER JOIN cliente c USING(rut_cliente)
  21.   LEFT JOIN comuna co ON co.id_comuna = c.id_comuna
  22.   LEFT JOIN ciudad ci ON ci.id_ciudad = c.id_ciudad

Pd. Por cierto sabia que los select que tenia hecho eran ineficientes, pero por mi inexperiencia lo habia echo asi. Pero ahora quedo mas eficiente la consulta.


Muchas gracias!!
__________________
"La blanda respuesta quita la ira, Mas la palabra áspera hace subir el furor"
  #4 (permalink)  
Antiguo 14/12/2009, 13:01
Avatar de Capote  
Fecha de Ingreso: julio-2007
Ubicación: C h i l e
Mensajes: 136
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta JOIN

Estoy complementando mi consulta agregando un parametro que me falta resumen_contrato_cliente que esta en la tabla contrato_cliente. Lo estoy haciendo con LEFT JOIN si bien se me ejecuta la consulta, y puedo ver lo que contiene cada campo.
Resulta que me muestra 4 veces la misma fila. ¿Que esta mal?

Aqui es como hago la consulta:

Código MySQL:
Ver original
  1.   ef.numero_factura,
  2.   ef.fecha_factura,
  3.   CONCAT(c.rut_cliente,"-",c.dv_cliente),
  4.   c.giro_cliente,
  5.   c.direccion_cliente,
  6.   cc.resumen_contrato_cliente,
  7.   co.descripcion_comuna,
  8.   ci.descripcion_ciudad,
  9.   cf.linea_factura,
  10.   cf.id_contrato_cliente,
  11.   cf.cantidad,
  12.   cf.descuento,
  13.   cf.precio_unitario,
  14.   pf.valor_neto,
  15.   pf.valor_iva,
  16.   pf.valor_bruto,
  17.   pf.total_descuento
  18. FROM encabezado_factura ef
  19.   INNER JOIN cuerpo_factura cf USING (numero_factura)
  20.   INNER JOIN pie_factura pf USING (numero_factura)
  21.   INNER JOIN cliente c USING (rut_cliente)
  22.   LEFT JOIN contrato_cliente cc ON cc.rut_cliente = c.rut_cliente
  23.   LEFT JOIN comuna co ON co.id_comuna = c.id_comuna
  24.   LEFT JOIN ciudad ci ON ci.id_ciudad = c.id_ciudad


Gracias!
__________________
"La blanda respuesta quita la ira, Mas la palabra áspera hace subir el furor"
  #5 (permalink)  
Antiguo 14/12/2009, 13:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con consulta JOIN

Es muy probable que haya cuatro (4) entradas en la tabla contrato_cliente respecto de cada cliente. Lo que habría que ver es si contrato_cliente se relaciona con encabezado_factura, mas que con cliente.
Esto es: ¿no es que la factura corresponde a un contrato? Si es así, el contrato lleva el número de la factura, o bien la factura el del contrato. De esa forma la relación sí es 1:1.
Si el cliente tiene más de un contrato, entonces la relación que hay que hacer entre factura - cliente y contrato es como te digo.

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/12/2009, 14:23
Avatar de Capote  
Fecha de Ingreso: julio-2007
Ubicación: C h i l e
Mensajes: 136
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta JOIN

Hola, @gnzsoloyo.
Con lo que me decias me puse a revizar mi consulta y me percate de que estaba mal haciendo esa consulta, pues contrato_cliente se relaciona con cuerpo_factura en dode el codigo_contrato queda como FK en este último. Y con un JOIN entre ellas puedo consultar por el parametro en cuestion, quedandome así:

Código MySQL:
Ver original
  1. ....
  2. ....
  3. cc.resumen_contrato_cliente,
  4. ...
  5. ...
  6. ...
  7. FROM encabezado_factura ef
  8. ...
  9. ...
  10.  LEFT JOIN contrato_cliente cc ON cc.id_contrato_cliente = cf.id_contrato_cliente


Gracias!!
__________________
"La blanda respuesta quita la ira, Mas la palabra áspera hace subir el furor"
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 05:39.