В моей программе пользователь может заработать очки в месте проведения, выполнив регистрацию в этом месте.
Затем они могут использовать эти очки для получения вознаграждений в этом месте. Очки не распределяются между объектами.
У меня есть следующие таблицы:
Пользователи
места
check_ins
- ID
- user_id (FK): пользователь, заработавший балл
- venue_id (FK): место, в котором пользователь заработал очки в
- баллов: сумма набранных баллов
награды
- ID
- имя
- venue_id: место, к которому относится награда
- баллов: сумма вознаграждения
reward_redemptions
Я могу рассчитать общее количество баллов у пользователя по месту проведения следующим образом:
select venue_id, sum(points) as total_points
from check_ins
WHERE user_id = 109
group by venue_id, user_id;
Я могу рассчитать количество очков, выкупленных в зависимости от места, следующим образом:
select venue_id, sum(points) as points_redeemed
from reward_redemptions
JOIN rewards on reward_redemptions.reward_id = rewards.id
GROUP BY venue_id;
Затем я могу использовать язык программирования (например, PHP) для вычисления очков, оставшихся для каждого места, вычитая их.
Однако я хочу использовать SQL для этого (в идеале в 1 запросе, чтобы уменьшить вероятность изменения данных между запросами, упростить код и потенциально повысить производительность). Конечный результат в идеале был бы следующим:
venue_id total_points points_redeemed points_remaining
#5 10 2 8
#15 25 10 15
#189 150 20 130
Итак, мои вопросы:
- Можно ли получить общее количество баллов и баллов, выкупленных за один запрос?
- Можно ли получить общее количество баллов, обмененных баллов и баллов, оставшихся в одном запросе?