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

Select a tres tablas con el id de una

Estas en el tema de Select a tres tablas con el id de una en el foro de Mysql en Foros del Web. Hola a todos/as. Tengo una tabla cliente en que registro los mismos y después estos pueden commprar con factura a o b. Tengo dos tablas ...
  #1 (permalink)  
Antiguo 16/11/2017, 07:50
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Select a tres tablas con el id de una

Hola a todos/as.
Tengo una tabla cliente en que registro los mismos y después estos pueden commprar con factura a o b.
Tengo dos tablas factura y facturaa.
el id_cliente se toma de la tabla cliente y en cada factura se registra en la a o b como id_cliente.

necesito para hacer un reporte en jasperreports usando la consulta que me seleccione todas las facturas a y aa que tengan el mismo id_cliente o los id_cliente que estén en una u otra solamente.

Logro traerlos pero me los repite los registros o me toma todo mezclado.

Gracias!!

Código:
SELECT clie.nombre_cliente, fac.id_factura, fac.id_cliente, fac.fecha_factura, fac.tipo_factura, fac.total, faca.id_factura, faca.id_cliente, faca.fecha_factura, faca.tipo_factura, faca.total
FROM clientes AS clie
JOIN factura AS fac ON clie.id_cliente = fac.id_cliente
LEFT JOIN facturaa AS faca ON clie.id_cliente = faca.id_cliente
WHERE clie.id_cliente =  '26'
esa es la consulta.
Tabla factura
Código:
 CREATE TABLE `factura` (
  `id_factura` int(11) unsigned NOT NULL auto_increment,
  `id_cliente` int(11) default NULL,
  `fecha_factura` varchar(70) NOT NULL,
  `tipo_factura` varchar(4) NOT NULL,
  `formade_pago` varchar(70) NOT NULL,
  `total` double NOT NULL,
  PRIMARY KEY  (`id_factura`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=221 ;
Código:
Tabla facturaa
Código:
CREATE TABLE `facturaa` (
  `id_factura` int(11) unsigned NOT NULL auto_increment,
  `id_cliente` int(11) NOT NULL,
  `fecha_factura` varchar(70) NOT NULL,
  `tipo_factura` varchar(4) NOT NULL,
  `total` double NOT NULL,
  PRIMARY KEY  (`id_factura`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=78 ;
tabla clientes
CREATE TABLE `clientes` ( `id_cliente` int(11) unsigned zerofill NOT NULL auto_increment, `nombre_cliente` varchar(50) NOT NULL, `dni_cliente` varchar(12) NOT NULL, `direccion_cliente` varchar(80) NOT NULL, `telefono_cliente` varchar(12) default NULL, `email_cliente` varchar(60) default NULL, `direccionparaenvios` varchar(300) default NULL, PRIMARY KEY (`id_cliente`), UNIQUE KEY `dni_cliente` (`dni_cliente`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
  #2 (permalink)  
Antiguo 16/11/2017, 09:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Select a tres tablas con el id de una

podrias poner un ejemplo de tus datos? en ocasiones cuando "repite" informacion, no es tanto que este repetida, sino que puede estar en una tabla 2 veces con diferente fecha y lo que se hace aqui es agregar mas condiciones al where
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 16/11/2017, 09:54
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

Cita:
Iniciado por Libras Ver Mensaje
podrias poner un ejemplo de tus datos? en ocasiones cuando "repite" informacion, no es tanto que este repetida, sino que puede estar en una tabla 2 veces con diferente fecha y lo que se hace aqui es agregar mas condiciones al where

Claro, el mismo cliente puede comprar en las dos tablas porque puede ser consumidor final y después ya ser responsable inscripto.


clientes:

Código:
INSERT INTO `clientes` VALUES (00000000020, 'daniel romero', '424353245', 'regtwert', '4352453425', 'bvsfdgfdsg ', NULL);
INSERT INTO `clientes` VALUES (00000000026, 'veronica messi', '2434254353', 'vb', 'cxbxnbx', 'cxvb', NULL);

factura
cliente nº 26
Código:
INSERT INTO `factura` VALUES (225, 26, ' 14.11.17 17:29:55', 'B', 'Pago de Contado', 23);
INSERT INTO `factura` VALUES (226, 26, ' 14.11.17 19:47:05', 'B', 'Pago de Contado', 1.91);
factura a

cliente 20 y 26

Código:
INSERT INTO `facturaa` VALUES (80, 10, ' 09.11.17 17:25:42', 'A', 602.56);
INSERT INTO `facturaa` VALUES (81, 20, ' 09.11.17 17:42:04', 'A', 1115.09);
INSERT INTO `facturaa` VALUES (82, 20, ' 14.11.17 13:12:40', 'A', 27.83);
  #4 (permalink)  
Antiguo 16/11/2017, 09:58
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Select a tres tablas con el id de una

Ahi esta el porque de los duplicados, tendrias que poner una condicion extra en tu where ya se el que tenga el registro mas nuevo, mas viejo o cualquier otra condicion para discriminar los registros "repetidos"
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 16/11/2017, 11:40
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

primero que nada gracias por responder

yo necesito que me muestre todas las facturas por cliente x seleccionado.
pero me repite por ejemplo si en la tabla factura tengo tres facturas del cliente 26 y en la factutraa tengo una me trae las tres de la a y la de la facturaa la muestra tres veces también.
  #6 (permalink)  
Antiguo 16/11/2017, 11:52
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Select a tres tablas con el id de una

Por eso no entiendes la logica? No esta repitiendo los registros, te trae 3 porque estos existen en la tabla facturaa, por eso te digo que pongas otro discriminante en el where o una funcion de agregado(min, max, sum, avg) para que nada mas te muestre un registro por cliente, si no lo haces asi va a seguir "duplicando" registros

Ahora porque 2 tablas de factura?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 16/11/2017, 12:10
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

Asi me repite

Código HTML:
Textos completos
nombre_cliente	id_factura	id_cliente	fecha_factura	tipo_factura	total	id_factura	id_cliente	fecha_factura	tipo_factura	total
sergio pereyra	1	1	16.11.17 14:17:32	B	3345	2	1	16.11.17 15:11:08	A	1252.35
sergio pereyra	1	1	16.11.17 14:17:32	B	3345	3	1	16.11.17 15:12:17	A	1252.35
  #8 (permalink)  
Antiguo 16/11/2017, 12:15
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

Cita:
Iniciado por Libras Ver Mensaje
Por eso no entiendes la logica? No esta repitiendo los registros, te trae 3 porque estos existen en la tabla facturaa, por eso te digo que pongas otro discriminante en el where o una funcion de agregado(min, max, sum, avg) para que nada mas te muestre un registro por cliente, si no lo haces asi va a seguir "duplicando" registros

Ahora porque 2 tablas de factura?
si es raro lo de las dos tablas
lo hicieron proque el tipo factura B es para consumidores finales y el Tipo A para Responsebles Inscriptos
Generea una numeración para la B y otra para la A.
El tipo A discrimina Iva, precio unitario, etc. supongo que por eso lo hicieron así
  #9 (permalink)  
Antiguo 16/11/2017, 12:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Select a tres tablas con el id de una

Esos no son datos repetidos, son datos diferentes, si revisas bien el id_factura tiene 2 valores, y tambien el campo fecha_factura tiene valores diferentes, eso indica que son 2 valores diferentes no iguales.

si fueran datos iguales entonces con un select distinct sacarias nada mas un registro.
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 16/11/2017, 13:37
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

Cita:
Iniciado por Libras Ver Mensaje
Esos no son datos repetidos, son datos diferentes, si revisas bien el id_factura tiene 2 valores, y tambien el campo fecha_factura tiene valores diferentes, eso indica que son 2 valores diferentes no iguales.

si fueran datos iguales entonces con un select distinct sacarias nada mas un registro.
la factura 1 la muestra dos veces
Código HTML:
Textos completos
nombre_cliente	id_factura	id_cliente	fecha_factura	tipo_factura	total
Código HTML:
sergio pereyra	1	1	16.11.17 14:17:32	B	3345
Código HTML:
sergio pereyra	1	1	16.11.17 14:17:32	B	3345
  #11 (permalink)  
Antiguo 16/11/2017, 13:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select a tres tablas con el id de una

Hola mvlsistemas:

el problema es que tienes dos relaciones 1 a muchos entre tus clientes y tus facturas y al querer unirlas esto se convierte en una relación muchos a muchos... en otras palabras, es una especie de "producto cartesiano" que te puede "repetir" resultados, pero tal como lo comenta libras, en realidad los registros NO ESTÁN REPETIDOS, sino que simplemente no se están presentando como tu quieres.

Una posible "solución" sería utilizar un UNION entre tus facturas para que sólo tengas una tabla, va un ejemplo para ver si queda claro. Supongamos que tenemos estas tablas;

Código MySQL:
Ver original
  1. mysql> SELECT * FROM clientes;
  2. +------------+----------------+
  3. | id_cliente | nombre_cliente |
  4. +------------+----------------+
  5. |          1 | cliente uno    |
  6. |          2 | cliente dos    |
  7. |          3 | cliente tres   |
  8. +------------+----------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM factura;
  12. +------------+------------+-------+
  13. | id_factura | id_cliente | monto |
  14. +------------+------------+-------+
  15. |          1 |          1 |   100 |
  16. |          2 |          1 |   200 |
  17. |          3 |          2 |   300 |
  18. |          4 |          2 |   400 |
  19. |          5 |          3 |   500 |
  20. +------------+------------+-------+
  21. 5 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT * FROM facturaa;
  24. +------------+------------+-------+
  25. | id_factura | id_cliente | monto |
  26. +------------+------------+-------+
  27. |         10 |          1 |   600 |
  28. |         11 |          1 |   700 |
  29. |         12 |          2 |   800 |
  30. |         13 |          2 |   900 |
  31. |         14 |          2 |  1000 |
  32. +------------+------------+-------+
  33. 5 rows in set (0.00 sec)

entonces, tal como haces tu consulta, tendrías esto:

Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM clientes AS clie
  3.     -> JOIN factura AS fac ON clie.id_cliente = fac.id_cliente
  4.     -> LEFT JOIN facturaa AS faca ON clie.id_cliente = faca.id_cliente;
  5. +------------+----------------+------------+------------+-------+------------+------------+-------+
  6. | id_cliente | nombre_cliente | id_factura | id_cliente | monto | id_factura | id_cliente | monto |
  7. +------------+----------------+------------+------------+-------+------------+------------+-------+
  8. |          1 | cliente uno    |          1 |          1 |   100 |         10 |          1 |   600 |
  9. |          1 | cliente uno    |          2 |          1 |   200 |         10 |          1 |   600 |
  10. |          1 | cliente uno    |          1 |          1 |   100 |         11 |          1 |   700 |
  11. |          1 | cliente uno    |          2 |          1 |   200 |         11 |          1 |   700 |
  12. |          2 | cliente dos    |          3 |          2 |   300 |         12 |          2 |   800 |
  13. |          2 | cliente dos    |          4 |          2 |   400 |         12 |          2 |   800 |
  14. |          2 | cliente dos    |          3 |          2 |   300 |         13 |          2 |   900 |
  15. |          2 | cliente dos    |          4 |          2 |   400 |         13 |          2 |   900 |
  16. |          2 | cliente dos    |          3 |          2 |   300 |         14 |          2 |  1000 |
  17. |          2 | cliente dos    |          4 |          2 |   400 |         14 |          2 |  1000 |
  18. |          3 | cliente tres   |          5 |          3 |   500 |       NULL |       NULL |  NULL |
  19. +------------+----------------+------------+------------+-------+------------+------------+-------+
  20. 11 rows in set (0.05 sec)

aquí podrías suponer que hay facturas REPETIDAS, pero en realidad no es así... es más, tal parecería que hay más facturas, ya que aparecen 11 registros mientras que sólo hay 10 facturas.

El problema insisto está en que estás haciendo un doble JOIN... Si bien las dos tablas de facturas están relacionadas con los clientes, en realidad no hay una relación directa entre factura y facturaa directa, por lo tanto, se hace un producto.

¿qué podrías hacer?... podrías cambiar por un UNION para juntar primero todas tus facturas y después hacer el JOIN con los clientes, es decir, algo así:

Código SQL:
Ver original
  1. mysql> SELECT * FROM clientes C
  2.     -> INNER JOIN
  3.     -> ( SELECT * FROM factura
  4.     ->   UNION ALL
  5.     ->   SELECT * FROM facturaa
  6.     -> ) T ON C.id_cliente = T.id_cliente;
  7. +------------+----------------+------------+------------+-------+
  8. | id_cliente | nombre_cliente | id_factura | id_cliente | monto |
  9. +------------+----------------+------------+------------+-------+
  10. |          1 | cliente uno    |          1 |          1 |   100 |
  11. |          1 | cliente uno    |          2 |          1 |   200 |
  12. |          1 | cliente uno    |         10 |          1 |   600 |
  13. |          1 | cliente uno    |         11 |          1 |   700 |
  14. |          2 | cliente dos    |          3 |          2 |   300 |
  15. |          2 | cliente dos    |          4 |          2 |   400 |
  16. |          2 | cliente dos    |         12 |          2 |   800 |
  17. |          2 | cliente dos    |         13 |          2 |   900 |
  18. |          2 | cliente dos    |         14 |          2 |  1000 |
  19. |          3 | cliente tres   |          5 |          3 |   500 |
  20. +------------+----------------+------------+------------+-------+
  21. 10 ROWS IN SET (0.00 sec)

Pero OJO, para hacer el UNION, las tablas deben tener el mismo numero de campos, así es que deberás tener cuidado con la selección.

Saludos
Leo.
  #12 (permalink)  
Antiguo 16/11/2017, 14:31
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

muchas gracias!voy a ver eso y tratar de que funcione.
Si agregando forma de pago en factutraa tendrían ambas 6 campos y ahí la UNION funcionaría.

gracias nuevamente voy a ponerme a trabajar en eso.
  #13 (permalink)  
Antiguo 16/11/2017, 17:16
 
Fecha de Ingreso: mayo-2004
Mensajes: 903
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Select a tres tablas con el id de una

leonardo_josue y Libra muchísimas gracias!
me funcionó.
Uso la consulta en un Jasperreport desde JAVA SE y MYSQL y ahora con UNION pude.

Abrazo grande y otra vez gracias.

Código:
 
SELECT * FROM clientes C
 INNER JOIN
( SELECT * FROM factura
UNION ALL
SELECT * FROM facturaa
) T ON C.id_cliente = T.id_cliente Where 
T.id_cliente=$P{id_cliente}
Código HTML:
1	sergio pereyra	202043222222	kjnoiefv	23445325342	[email protected]		1	 16.11.17 14:17:32	B	Pago de Contado	3345.0
1	sergio pereyra	202043222222	kjnoiefv	23445325342	[email protected]		2	 16.11.17 15:11:08	A	Pago de Contado	1252.35
1	sergio pereyra	202043222222kjnoiefv	23445325342	[email protected]		3	 16.11.17 15:12:17	A	Pago de Contado	1252.35

Etiquetas: ip, registro, select, tabla, tablas, tres
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 11:16.