Je commencerais par écrire une requête qui fonctionne ce qu'est une part unique d'un paiement. Autrement dit, par payment_id
, la somme de tous les montants, divisée par le nombre de personnes qu'elle doit payer. Ce résultat peut ensuite être associé aux données d'origine.
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
Il sera avantageux d'avoir des index sur (payment_id)
et (payer_id)
.
Il sera avantageux d'avoir le amount
champ dans un type de données DECIMAL, bien que vous deviez considérer ce que vous voulez faire avec l'arrondi. (Un paiement total de 10,00 doit être divisé en trois parties, 3,33 chacune, puis que voulez-vous qu'il advienne des 0,01 de réserve ?)