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+------------+-------------+
| id_cliente | descripcion |
+------------+-------------+
| 1 | Cliente 1 |
| 2 | Cliente 2 |
| 3 | Cliente 3 |
| 4 | Cliente 4 |
+------------+-------------+
+------------+------------+-------------+-------------+
| id_factura | id_cliente | num_factura | descripcion |
+------------+------------+-------------+-------------+
| 1 | 1 | 1 | Factura 1.1 |
| 2 | 1 | 2 | Factura 1.2 |
| 3 | 2 | 3 | Factura 2.1 |
| 4 | 2 | 4 | Factura 2.1 |
| 5 | 3 | 5 | Factura 3.1 |
+------------+------------+-------------+-------------+
+----------+------------+-----------+-------------+
| id_abono | id_cliente | num_abono | descripcion |
+----------+------------+-----------+-------------+
| 1 | 1 | 10 | Abono 1.1 |
| 2 | 1 | 11 | Abono 1.2 |
| 3 | 2 | 12 | Abono 2.1 |
+----------+------------+-----------+-------------+
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+------------+----------------+
| id_cliente | total_facturas |
+------------+----------------+
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
+------------+----------------+
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 originalmysql
> SELECT C.id_cliente
, C.descripcion
, F.total_facturas
, A.total_abonos
-> GROUP BY id_cliente
) F
ON C.id_cliente
= F.id_cliente
-> GROUP BY id_cliente
) A
ON C.id_cliente
= A.id_cliente
; +------------+-------------+----------------+--------------+
| id_cliente | descripcion | total_facturas | total_abonos |
+------------+-------------+----------------+--------------+
| 1 | Cliente 1 | 2 | 2 |
| 2 | Cliente 2 | 2 | 1 |
| 3 | Cliente
3 | 1 | NULL | +------------+-------------+----------------+--------------+
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.