Ver Mensaje Individual
  #11 (permalink)  
Antiguo 16/11/2017, 13:39
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.