Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Inner join de 3 tablas

Estas en el tema de Inner join de 3 tablas en el foro de PHP en Foros del Web. Hola! Tengo 3 tablas clientes id_cliente nro_rifa apellido_nombre cobrador monto_cuota cobradores id_cobrador codigo_cobrador apellido_nombre cobranzas id_cobranza cobrador (guarda el id_cobrador) nro_rifa (guarda el id_cliente) nro_cuota ...
  #1 (permalink)  
Antiguo 25/01/2014, 12:03
 
Fecha de Ingreso: agosto-2003
Mensajes: 524
Antigüedad: 20 años, 8 meses
Puntos: 5
Inner join de 3 tablas

Hola!

Tengo 3 tablas

clientes
id_cliente
nro_rifa
apellido_nombre
cobrador
monto_cuota

cobradores
id_cobrador
codigo_cobrador
apellido_nombre

cobranzas
id_cobranza
cobrador (guarda el id_cobrador)
nro_rifa (guarda el id_cliente)
nro_cuota
fecha_pago

Hago una búsqueda con el codigo_cobrador, y con un inner join de las 3 tablas necesito obtener lo siguiente:

Código Cobrador
Nombre Cobrador
Nro Rifa
Nombre Cliente
Nro Cuota
Monto
Fecha Pago

Esta es la consulta que armé:

Código PHP:
SELECT `cobradores`.`id_cobrador`, `cobradores`.`codigo_cobrador`, `cobradores`.`apellido_nombre` AS nombrecobrador, `clientes`.`id_cliente`, `clientes`.`apellido_nombre` AS `nombrecliente`, `clientes`.`nro_rifa` AS rifa, `clientes`.`cobrador`, `clientes`.`monto_cuota`, `cobranzas`.`cobrador`, `cobranzas`.`nro_rifa`, `cobranzas`.`nro_cuota`, `cobranzas`.`fecha_pagoFROM `cobradoresINNER JOIN `clientesON `cobradores`.`id_cobrador` = `clientes`.`cobradorINNER JOIN `cobranzasON `cobradores`.`id_cobrador` = `cobranzas`.`cobradorWHERE `cobradores`.`codigo_cobrador` = $codigocobrador"; 

Pero tengo una falla en el resultado, me trae lo siguiente:

Código Cobrador: 100 // esto está ok
Nombre Cobrador: Cobrador A // esto está ok

Pero cuando tiene que mostrar todos los clientes del Cobrador A, en este caso, trae la cantidad correcta de registros pero en todos se repite el mismo cliente, es decir, que si el resultado son 3 registros del cobrador A queda:

Nro Rifa: 154
Nombre Cliente Cliente 1
...

Nro Rifa: 154
Nombre Cliente Cliente 1
...

Nro Rifa: 154
Nombre Cliente Cliente 1
...



Espero me puedan ayudar, muchas gracias!
__________________
Saludos!!!
Maru.-
  #2 (permalink)  
Antiguo 25/01/2014, 12:47
Avatar de mark_ant0n  
Fecha de Ingreso: enero-2009
Ubicación: Comitan, Chiapas mx
Mensajes: 388
Antigüedad: 15 años, 3 meses
Puntos: 6
Respuesta: Inner join de 3 tablas

Prueba con esto, espero te sirva saludos....

Código MySQL:
Ver original
  1. From cliente Cli
  2. Inner Join Cobradores Cob
  3. On Cli.id_cliente = Cob.id_cobrador
  4. Inner JOin cobranzas Cobra
  5. On Cobra.id_cobrador = Cob.id_cobrador
  6.     And Cobra.cobrador = Cob.codigo_cobrador
  7. Where Cli.id_cliente = 89 -- id del cliente
__________________
"Diseño de software a la medida"

http://www.sadhoc.com
  #3 (permalink)  
Antiguo 25/01/2014, 13:20
 
Fecha de Ingreso: agosto-2003
Mensajes: 524
Antigüedad: 20 años, 8 meses
Puntos: 5
Respuesta: Inner join de 3 tablas

Gracias por responder! esa consulta no me devuelve ningún resultado.
La búsqueda la debo hacer por código de cobrador.
__________________
Saludos!!!
Maru.-
  #4 (permalink)  
Antiguo 25/01/2014, 17:30
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Inner join de 3 tablas

Hola , llevo un rato dándole vueltas al tema ! , tampoco soy un gran experto !

A ver a priori , necesitaría saber los datos que están el la tabla ... porque me da la sensación que o tenemos un problema de lógica , o me faltaría saber como están estructurados los datos ( el monto cuota siempre es el mismo para cada cliente ? o puede ser un valor que varía en función de lo que pague?
y el clientes.nro_rifa es igual que el clientes.Id_clientes y que cobranzas.nro_rifa?) .

Prueba con esto ! a ver si es lo que buscas , luego ya optimizaremos la consulta!

Código MySQL:
Ver original
  1. SELECT  `clientes`.`cobrador`,
  2.     `cobradores`.`apellido_nombre`,
  3.     `cobranzas`.`nro_rifa`,
  4.     `clientes`.`apellido_nombre` AS `nombrecliente`,
  5.     `cobranzas`.`nro_cuota`,
  6.     `clientes`.`monto_cuota`,
  7.     `cobranzas`.`fecha_pago`,
  8.     `cobradores`.`codigo_cobrador` AS 'cobradores'
  9.    
  10.  
  11. FROM cobranzas,clientes,cobradores
  12.  
  13.     WHERE cobranzas.`cobrador` IN
  14.    
  15.     ( SELECT clientes.`cobrador`
  16.         FROM clientes,cobradores
  17.             WHERE clientes.`cobrador` = cobradores.`codigo_cobrador`
  18.                 AND clientes.`cobrador` = '.$codigocobrador.')
  19.    
  20.     AND
  21.    
  22.     clientes.`cobrador` IN
  23.    
  24.     ( SELECT cobranzas.`cobrador`
  25.         FROM cobranzas,cobradores
  26.             WHERE cobranzas.`cobrador` = cobradores.`codigo_cobrador`
  27.             AND cobranzas.`cobrador` = '.$codigocobrador.')
  28.    
  29.     AND
  30.    
  31.     cobradores.`codigo_cobrador` IN
  32.    
  33.     ( SELECT cobranzas.`cobrador`
  34.         FROM cobranzas,clientes
  35.             WHERE cobranzas.`cobrador` = clientes.`cobrador`
  36.             AND cobranzas.`nro_rifa` = clientes.`id_cliente`
  37.             AND cobranzas.`cobrador` = '.$codigocobrador.')

Saludos!

Última edición por Djoaq; 25/01/2014 a las 17:33 Razón: me olvidé una cosika!
  #5 (permalink)  
Antiguo 25/01/2014, 17:34
 
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 487
Antigüedad: 12 años, 8 meses
Puntos: 31
Respuesta: Inner join de 3 tablas

Porque no haces dos consulta, no te va a robar tanto tiempo y te rompes menos las cabeza
__________________
El talento se educa en la KARMA y el carácter en la tempestad.
Gabriel De Los Santos
  #6 (permalink)  
Antiguo 25/01/2014, 17:59
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Inner join de 3 tablas

Hola,

Cita:
Iniciado por Maru77 Ver Mensaje
...
cobranzas
id_cobranza
cobrador (guarda el id_cobrador)
nro_rifa (guarda el id_cliente)
nro_cuota
fecha_pago
...
Seguramente tienes un problema de diseño o de lógica como indica Djoaq.
nro_rifa (guarda el id_cliente)
¿Estás seguro que guardas el ID del cliente en un campo llamado nro_rifa?

Cita:
Iniciado por Djoaq Ver Mensaje
... porque me da la sensación que o tenemos un problema de lógica , ...
Seguramente hay un problema de lógica, ese tipo de consultas es mucho mas simple, normalmente no requiere de subconsultas; una vez los datos este correctamente normalizados y las relaciones estén bien diseñadas.

Cita:
Iniciado por gldelossantos Ver Mensaje
Porque no haces dos consulta, no te va a robar tanto tiempo y te rompes menos las cabeza
Posiblemente va a dar el mismo resultado, puesto que el problema en este caso, posiblemente, esta basado en un mal diseño o en el mejor de los casos una mala explicación del problema.

Adicionalmente, desde mi punto de vista, hacer una consulta con un join de tres tablas no debería ser tan complicado para alguien que se dedica a programar, es extraño ese fenómeno que sucede en este trabajo.

Saludos,
  #7 (permalink)  
Antiguo 25/01/2014, 17:59
 
Fecha de Ingreso: agosto-2003
Mensajes: 524
Antigüedad: 20 años, 8 meses
Puntos: 5
Respuesta: Inner join de 3 tablas

gracias Djoaq por tomarte la molestia de trabajar en mi ejemplo, yo también sigo buscandole la vuelta, probé tu consulta pero me arroja un resultado vacío.
__________________
Saludos!!!
Maru.-
  #8 (permalink)  
Antiguo 25/01/2014, 18:02
 
Fecha de Ingreso: agosto-2003
Mensajes: 524
Antigüedad: 20 años, 8 meses
Puntos: 5
Respuesta: Inner join de 3 tablas

Hackmanc, el nro_rifa NO guarda el id_cliente, me expresé mal, pero es como una especie de código o identificación ya que es un número que no se repite.
__________________
Saludos!!!
Maru.-
  #9 (permalink)  
Antiguo 25/01/2014, 18:27
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Inner join de 3 tablas

Hola,

Cita:
Iniciado por Maru77 Ver Mensaje
Hackmanc, el nro_rifa NO guarda el id_cliente, me expresé mal, pero es como una especie de código o identificación ya que es un número que no se repite.
El problema es que ese pequeño detalle hace que una consulta no funcione, y digo no funcione completamente, dando resultados vacíos o erróneos completamente.

Posiblemente,

Código SQL:
Ver original
  1. SELECT ...
  2. FROM cobranzas
  3. INNER JOIN cobradores ON cobranzas.cobrador = cobradores.codigo_cobrador
  4. INNER JOIN clientes ON cobranzas.nro_rifa = clientes.nro_rifa
  5. WHERE cobradores.id_cobrador = 1

Si le das vuelta a la consulta, poniendo cobranzas como la tabla primaria, resulta mucho mas simple comprender el problema y posiblemente se te va a ser mas fácil resolverlo. Una vez resultas el problema de saber si el ID (nro_rifa) que estas guardando en cobranzas corresponde al nro_rifa o id_cliente en la tabla clientes.

Eso sucede porque estás usando 'surrogate keys'. Tienes un ID para identificar el registro en la tabla, pero al mismo tiempo tienes un código. Como supongo (según lo que comentaste) que se hizo la relación por la 'natural key', posiblemente te va a funciona la consulta que mostré, pero va a depender completamente de como se haya hecho verdaderamente la relación en la base de datos.

Basados en el hecho que nro_rifa NO guarda el ID del cliente, entonces esta es la relación,
Código SQL:
Ver original
  1. INNER JOIN clientes ON cobranzas.nro_rifa = clientes.nro_rifa
Con el problema que entonces en las relaciones se usa la 'natural key', eso normalmente es un problema de diseño.

Saludos,

Última edición por HackmanC; 25/01/2014 a las 18:38 Razón: aclarar y limpiar
  #10 (permalink)  
Antiguo 25/01/2014, 18:57
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Inner join de 3 tablas

Cita:
Iniciado por Maru77 Ver Mensaje
gracias Djoaq por tomarte la molestia de trabajar en mi ejemplo, yo también sigo buscandole la vuelta, probé tu consulta pero me arroja un resultado vacío.
Te arrojó valores vacíos porque entendí
Código MySQL:
Ver original
  1. AND cobranzas.`nro_rifa` = clientes.`id_cliente`

De todas formas cobranzas.`cobrador` es igual que cobradores.`codigo_cobrador`?

así que la consulta teniendo en cuenta la relación de cobrador = codigo_cobrador debería funcionar! Prueba y me dices!

Código MySQL:
Ver original
  1. SELECT  `clientes`.`cobrador`,
  2.     `cobradores`.`apellido_nombre`,
  3.     `cobranzas`.`nro_rifa`,
  4.     `clientes`.`apellido_nombre` AS `nombrecliente`,
  5.     `cobranzas`.`nro_cuota`,
  6.     `clientes`.`monto_cuota`,
  7.     `cobranzas`.`fecha_pago`,
  8.     `cobradores`.`codigo_cobrador` AS 'cobradores'
  9.    
  10.  
  11. FROM cobranzas,clientes,cobradores
  12.  
  13.     WHERE cobranzas.`cobrador` IN
  14.    
  15.     ( SELECT clientes.`cobrador`
  16.         FROM clientes,cobradores
  17.             WHERE clientes.`cobrador` = cobradores.`codigo_cobrador`
  18.                 AND clientes.`cobrador` = '.$codigocobrador.')
  19.    
  20.     AND
  21.    
  22.     clientes.`cobrador` IN
  23.    
  24.     ( SELECT cobranzas.`cobrador`
  25.         FROM cobranzas,cobradores
  26.             WHERE cobranzas.`cobrador` = cobradores.`codigo_cobrador`
  27.             AND cobranzas.`cobrador` = '.$codigocobrador.')
  28.    
  29.     AND
  30.    
  31.     cobradores.`codigo_cobrador` IN
  32.    
  33.     ( SELECT cobranzas.`cobrador`
  34.         FROM cobranzas,clientes
  35.             WHERE cobranzas.`cobrador` = clientes.`cobrador`
  36.             AND cobranzas.`cobrador` = '.$codigocobrador.')



Aunque yo creo que como dice HackmanC , no es necesario tanta subconsulta! , yo normalmente agrupo cuando hago Joins y utilizo funciones ! pero me da miedo que se ponga agrupar sin comprobar la validez de los datos !

De todas formas creo que sería bueno que nos pusieras un muestreo de los datos que contiene la BD .


Saludos!!
  #11 (permalink)  
Antiguo 26/01/2014, 11:18
 
Fecha de Ingreso: agosto-2003
Mensajes: 524
Antigüedad: 20 años, 8 meses
Puntos: 5
Respuesta: Inner join de 3 tablas

quedó solucionado!

Código PHP:
$sql="SELECT `cobradores`.`codigo_cobrador`, `cobradores`.`apellido_nombre` AS nombrecobrador, `clientes`.`apellido_nombre` AS `nombrecliente`, `clientes`.`nro_rifa` AS rifa, `clientes`.`monto_cuota`, `cobranzas`.`nro_cuota`, `cobranzas`.`fecha_pago` FROM cobranzas INNER JOIN cobradores ON `cobranzas`.`cobrador` = `cobradores`.`id_cobrador` INNER JOIN clientes ON `cobranzas`.`nro_rifa` = `clientes`.`id_cliente` WHERE `cobradores`.`codigo_cobrador` = $codigocobrador ORDER BY nombrecliente ASC, `cobranzas`.`nro_cuota` ASC"
Mil gracias a todos por la ayuda!!!
__________________
Saludos!!!
Maru.-

Etiquetas: fecha, join, registro, select, tabla, tablas
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 23:36.