Začal bych tím, že napíšu dotaz, který funguje, co je to jeden podíl platby. Tedy podle payment_id
, součet všech částek vydělený počtem lidí, které potřebuje zaplatit. Tento výsledek lze poté připojit zpět k původním datům.
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
Bude výhodné mít indexy na obou (payment_id)
a (payer_id)
.
Bude výhodné mít amount
pole v datovém typu DECIMAL, i když musíte zvážit, co chcete udělat se zaokrouhlováním. (Celkovou platbu ve výši 10,00 je třeba rozdělit třemi způsoby, každý 3,33 a co potom chcete, aby se stalo zbývajících 0,01?)