Es un problema que se produce cuando se usan funciones agrupadas sobre diferentes columnas provenientes de diferentes tablas en un JOIN multitabla. En realidad lo que sucede es que realiza los JOIN antes de hacer la operación de la función, y como la cardinalidad es superior a 1, genera un producto cartesiano no previsto, antes de hacer la el agrupamiento.
La única solución es hacer que las diferentes tablas de datos se consoliden antes de usarlas en un JOIN, de modo que cuando este se haga la relación tenga cardinalidad 1 en todos los casos.
Hace unos días alguien preguntó por un caso similar, sólo que era con tres tablas, nada más.
La idea sería mas o menos:
Código MySQL:
Ver original UD.num_doc,
CONCAT(UD.last_name
, ', ', UD.first_name
) nombre
, CONCAT('$', ROUND((T.training_cost
- (T.training_cost
* PP.payment_plan_discount
/100)),2)) tot_a_pagar
, CONCAT('$', ROUND((T.training_cost
- (T.training_cost
* PP.payment_plan_discount
/ 100)) - (UP.user_paid
),2)) saldo
, UP.paid_date ultimo_pago
users_data UD
(SELECT MAX(paid_date
), SUM(user_paid
) user_paid
, id_user
, paid_date
ON UD.id_user
= UP.id_user
ON UD.id_user
= UPP.id_user
ON UPP.payment_plan_id
= PP.payment_plan_id
ON UD.id_user
= UT.id_user
ON UT.id_training
= T.training_id
Por cierto: Trata de usar ALIAS para simplificar la sintaxis, y procura no usar JOIN sólo. Define mejor la operación para que el parser utilice el algoritmo más eficiente.