2016-08-19 2 views
2

В настоящий момент я работаю с проблемой отслеживания истечения срока действия денег (первоначально это не деньги, но я использовал его как более удобный пример).отслеживание истечения срока действия денег

Пользователь может зарабатывать деньги с платформы по какой-то загадочной причине и тратить их на покупку вещей (продуктов, подарков и т. Д.).

Я ищу алгоритм (лучший запрос SQL-запроса), чтобы найти текущий баланс пользовательского баланса.

События расходов и зарабатывать деньги хранятся различные базы данных (MySQL ) таблицы (скажем, user_earned и user_spent). Поэтому в нормальном случае я бы просто подсчитал количество пользователей от user_earned и вычитал потраченные деньги (всего user_spent).

НО! Существует условие, что заработал пользовательские деньги, срок действия которых истекает через 2 года, если они не используются. Это означает, что если пользователь не использовал свои деньги или использовал только часть его, они истекают. Если пользователь использует свои деньги, они используются из самой старой записи с нулевыми деньгами , поэтому остаток (бонус) может быть рассчитан в пользу пользователя.

Эти 5 сценариев с событиями во времени, чтобы иметь лучшее представление о деле:

Money expiration logic

Обе таблицы (user_earned и user_spent) имеют временные метки для дат отслеживания.

+0

Это может быть задача, которая лучше всего выполняется в коде приложения. –

+0

В настоящее время я реализовал сервис, который вычисляет баланс, просто создавая список событий (получение, использование, истечение) и запуская их один за другим. Он работает, но в случае, когда мне нужно было найти баланс в SQL-запросе, чтобы получить пользователей с положительным балансом, мне пришлось бы денормализовать это значение до базы данных. – Aistis

ответ

1

Я сделал что-то подобное в одном из моих проектов.

Похоже, вам нужна дополнительная таблица spends_covering с колоннами spend_id, earhed_id, sum

Таким образом, для каждой записи spends вам нужно вставить одну или несколько строк в spends_covering, чтобы отметить «использовали» деньги.

Тогда баланс был бы просто суммой неиспользованного, если дата меньше 2 лет.

select sum(sub.earned_sum-sub.spent_sum) as balance 
from 
    (select e.sum as earned_sum, sum(sc.sum) as spent_sum 
    from earned e 
     left join spends_covering sc on e.earhed_id=sc.earhed_id 
    where e.date BETWEEN ... 
    group by e.earhed_id 
    having earned_sum > spent_sum) sub 
0

Это может быть стоит иметь две таблицы - один (или более) со всеми историческими деталями, один только с текущим сальдо для каждого пользователя «». Обязательно используйте транзакции, чтобы синхронизировать их.

Смежные вопросы