Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/11/2014, 16:15
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Restar dos Count MySQL

Hola guilens2:

El problema que tienes con tu consulta es que tienes dos relaciones 1 a muchos, que al unirse se convierten en muchos a muchos, lo cual puede ocasionar varios dolores de cabeza.

Tienes varias formas de afrontar esta consulta, una de las más simples desde mi punto de vista es Consolidar los totales en facturas y abonos, de tal manera que tu relación cambie de 1 a 1, no colocas mucha información de tus tablas, pero tratando de hacerle al adivino, creo que tienes algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM clientes;
  2. +------------+-------------+
  3. | id_cliente | descripcion |
  4. +------------+-------------+
  5. |          1 | Cliente 1   |
  6. |          2 | Cliente 2   |
  7. |          3 | Cliente 3   |
  8. |          4 | Cliente 4   |
  9. +------------+-------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM facturas;
  13. +------------+------------+-------------+-------------+
  14. | id_factura | id_cliente | num_factura | descripcion |
  15. +------------+------------+-------------+-------------+
  16. |          1 |          1 |           1 | Factura 1.1 |
  17. |          2 |          1 |           2 | Factura 1.2 |
  18. |          3 |          2 |           3 | Factura 2.1 |
  19. |          4 |          2 |           4 | Factura 2.1 |
  20. |          5 |          3 |           5 | Factura 3.1 |
  21. +------------+------------+-------------+-------------+
  22. 5 rows in set (0.00 sec)
  23.  
  24. mysql> SELECT * FROM abonos;
  25. +----------+------------+-----------+-------------+
  26. | id_abono | id_cliente | num_abono | descripcion |
  27. +----------+------------+-----------+-------------+
  28. |        1 |          1 |        10 | Abono 1.1   |
  29. |        2 |          1 |        11 | Abono 1.2   |
  30. |        3 |          2 |        12 | Abono 2.1   |
  31. +----------+------------+-----------+-------------+
  32. 3 rows in set (0.00 sec)

es decir, hay clientes que tienen facturas y abonos, clientes que solo tienen facturas y clientes que no tienen ni facturas ni abonos...

Si observas las tablas de FACTURAS Y ABONOS, puedes CONSOLIDAR los totales, agrupando por ID del cliente, es decir, hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT id_cliente, COUNT(*) total_facturas
  2.     -> FROM facturas
  3.     -> GROUP BY id_cliente;
  4. +------------+----------------+
  5. | id_cliente | total_facturas |
  6. +------------+----------------+
  7. |          1 |              2 |
  8. |          2 |              2 |
  9. |          3 |              1 |
  10. +------------+----------------+
  11. 3 rows in set (0.00 sec)

Observa que ahora puedes unir tu tabla CLIENTES con esta tabla, en una relación 1 a 1... lo mismo ocurre con los abonos.

Ahora bien, aquí es donde entran los LEFT JOIN's, para considerar aquellos que no tienen elementos en alguna de las tablas (o en ninguna), sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT C.id_cliente, C.descripcion, F.total_facturas, A.total_abonos
  2.     -> FROM clientes C
  3.     -> LEFT JOIN ( SELECT id_cliente, COUNT(*) total_facturas
  4.     ->             FROM facturas
  5.     ->             GROUP BY id_cliente) F ON C.id_cliente = F.id_cliente
  6.     -> LEFT JOIN ( SELECT id_cliente, COUNT(*) total_abonos
  7.     ->             FROM abonos
  8.     ->             GROUP BY id_cliente) A ON C.id_cliente = A.id_cliente ;
  9. +------------+-------------+----------------+--------------+
  10. | id_cliente | descripcion | total_facturas | total_abonos |
  11. +------------+-------------+----------------+--------------+
  12. |          1 | Cliente 1   |              2 |            2 |
  13. |          2 | Cliente 2   |              2 |            1 |
  14. |          3 | Cliente 3   |              1 |         NULL |
  15. |          4 | Cliente 4   |           NULL |         NULL |
  16. +------------+-------------+----------------+--------------+
  17. 4 rows in set (0.00 sec)

Observa que los LEFT JOIN's se hacen SOBRE LAS CONSULTAS CONSOLIDADAS, por lo que no debes tener problemas para hacer la resta.

Dale un vistazo para ver si te sirve.

Saludos
Leo.