Jag skulle börja med att skriva en fråga som fungerar vad en enskild andel av en betalning är. Det vill säga per payment_id
, summan av alla belopp, dividerat med antalet personer den behöver betala. Det resultatet kan sedan kopplas tillbaka till originaldata.
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
Det kommer att vara en fördel att ha index på båda (payment_id)
och (payer_id)
.
Det kommer att vara en fördel att ha amount
fält i en DECIMAL datatyp, även om du måste tänka på vad du vill göra med avrundning. (En total betalning på 10,00 måste delas på tre sätt, 3,33 vardera och vad vill du att ska hända med extra 0,01?)