Eu começaria escrevendo uma consulta que funcionasse o que é uma única parcela de um pagamento. Ou seja, por
payment_id
, a soma de todos os valores, dividida pelo número de pessoas que precisa pagar. Esse resultado pode então ser unido de volta aos dados originais. SELECT
payers_payments.payer_id,
SUM(payers_payments.amount ) AS total_paid,
SUM(payers_payments.pays * payments.single_share) AS fair_share
FROM
payers_payments
INNER JOIN
(
SELECT
payment_id,
SUM(amount) / SUM(pays) AS single_share
FROM
payers_payments
GROUP BY
payment_id
)
AS payments
ON payers_payments.payment_id = payments.payment_id
GROUP BY
payers_payments.payer_id
Será benéfico ter índices em ambos
(payment_id)
e (payer_id)
. Será benéfico ter o
amount
campo em um tipo de dados DECIMAL, embora você precise considerar o que deseja fazer com o arredondamento. (Um pagamento total de 10,00 precisa ser dividido de três maneiras, 3,33 cada e então o que você quer que aconteça com o 0,01 sobrando?)