我希望使用php和mysql
来实现这样的目标如果客户拥有奖励帐户并想要获得奖励,我该如何更新表格以便将所花费的奖励减去表格。
肯定会通过customer_id获得奖励总和,然后减去花费的奖励。如果第一行(奖励)小于消耗的值,它将减去所有然后转到下一行得到与先前结果的差异,直到花费的值等于0。
样品:
花费= 60 id_customer = 2
我有一张这样的表
id | id_customer | reward
1 | 2 | 50
2 | 2 | 20
3 | 3 | 100
4 | 4 | 5
结果应该是这样的:
第1行:50(第一行的值) - 60 = 0(剩余10行) 第2行:20(第2行的值) - 10(第1行的剩余点)= 0
id | id_customer | reward
1 | 2 | 0
2 | 2 | 10
3 | 3 | 100
4 | 4 | 5
希望这是有道理的。谢谢
答案 0 :(得分:0)
这是我的解决方案的逻辑(当然,可能不仅仅是这个和更好的解决方案): 获取该客户的行集(id_customer = 2)并循环返回的行。 在每次迭代中,将场奖励的值与您想要减去的金额进行比较(60)。 如果实际值>> 60,则更新该行并退出。如果没有,请将其更新为0,更新保留值(60 - 行值)并转到迭代中执行相同操作的下一项。
答案 1 :(得分:0)
在MySQL中,我认为最好的方法是使用变量。这应该有效:
declare @spent := 60;
update tablelikethis
set reward = (case when @spent = 0 then reward
when @spent >= reward
then (case when (@tmp := @spent) is null then NULL
when (@spent := @spent - reward) is null then NULL
else 0
end)
else (case when (@tmp := @spent) is null then NULL
when (@spent := 0) is null then NULL
else reward - @tmp
end)
end)
where id_customer = 2
order by id;
MySQL在单次更新中使这一点变得有点困难,因为您无法将order by
与join
一起使用。变量版本只需要处理关于奖励剩余金额是大于还是小于剩余金额的逻辑。
答案 2 :(得分:0)
我以不同的方式构建您的数据库。您可以创建一个名为" reward_points"的列。在客户表中,并有一个单独的奖励表。结构是:
REWARD_TABLE
----------------------------------
reward_id | customer_id | reward
----------------------------------
1 | 2 | 50
2 | 2 | 20
3 | 3 | 100
4 | 4 | 5
CUSTOMER_TABLE
-------------------------------------------------
customer_id | name | reward_points
-------------------------------------------------
1 | Eddard Stark | 0
2 | Jaime Lannister | 70
3 | Joffrey Baratheon | 100
4 | Theon Greyjoy | 5
然后您可以使用新值更新CUSTOMER_TABLE
。您可以将REWARD_TABLE
作为奖励历史记录'。更好......在购买时,您可以向REWARD_TABLE
添加否定交易,因此当您执行SELECT SUM(reward) as
奖励FROM reward_table WHERE customer_id = 2 GROUP BY customer_id
时,它也会计算所有负面交易,产生了一些与你的概念相近的东西。