Вычитание вычисленных значений из двух разных таблиц в SQL (MySQL) - PullRequest
0 голосов
/ 30 августа 2018

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

Затем они могут использовать эти очки для получения вознаграждений в этом месте. Очки не распределяются между объектами.

У меня есть следующие таблицы:

Пользователи

  • ID
  • имя

места

  • ID
  • имя

check_ins

  • ID
  • user_id (FK): пользователь, заработавший балл
  • venue_id (FK): место, в котором пользователь заработал очки в
  • баллов: сумма набранных баллов

награды

  • ID
  • имя
  • venue_id: место, к которому относится награда
  • баллов: сумма вознаграждения

reward_redemptions

  • ID
  • user_id
  • reward_id

Я могу рассчитать общее количество баллов у пользователя по месту проведения следующим образом:

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

Итак, мои вопросы:

  1. Можно ли получить общее количество баллов и баллов, выкупленных за один запрос?
  2. Можно ли получить общее количество баллов, обмененных баллов и баллов, оставшихся в одном запросе?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы можете объединить две таблицы, чтобы объединить их.

SELECT c.venue_id, c.user_id
        SUM(c.points) AS total_points, 
        IFNULL(r.points_redeemed, 0) AS points_redeemed, 
        SUM(c.points) - IFNULL(r.points_redeemed, 0) AS points_remaining
FROM check_ins AS c
LEFT JOIN (
    select venue_id, user_id, sum(points) as points_redeemed
    from reward_redemptions
    JOIN rewards on reward_redemptions.reward_id = rewards.id
    GROUP BY venue_id, user_id) AS r
ON c.venue_id = r.venue_id AND c.user_id = r.user_id
GROUP BY c.venue_id, c.user_id

В левое объединение необходимо включить пользователей, которые еще ничего не выкупили.

0 голосов
/ 30 августа 2018

Вы можете использовать union all и group by. Вот запрос о местах и ​​точках:

select venue_id, sum(total_points) as total_points,
       sum(points_redeemed) as points_redeemed
from ((select venue_id, sum(points) as total_points, 0 as points_redeemed
       from check_ins
       group by venue_id
      )
      union all
      (select venue_id, 0 as total_points, sum(points) as points_redeemed
       from reward_redemptions rr join
            rewards r
            on rr.reward_id = r.id
       group by venue_id
      )
     ) p
group by venue_id;

Разница может быть легко рассчитана путем вычитания сумм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...