Zacząłbym od napisania zapytania, które działa, jaka jest pojedyncza część płatności. Oznacza to, że za payment_id
, suma wszystkich kwot podzielona przez liczbę osób, które musi zapłacić. Wynik ten można następnie połączyć z oryginalnymi danymi.
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
Korzystne będzie posiadanie indeksów na obu (payment_id)
i (payer_id)
.
Korzystne będzie posiadanie amount
w typie danych DECIMAL, chociaż musisz rozważyć, co chcesz zrobić z zaokrąglaniem. (Łączna płatność 10,00 musi zostać podzielona na trzy sposoby, 3,33 na każdy, a potem co chcesz zrobić z zapasem 0,01?)