用条件更新mysql中的行的值?

时间:2014-09-09 14:35:37

标签: php mysql sql database foreach

我希望使用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

希望这是有道理的。谢谢

3 个答案:

答案 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 byjoin一起使用。变量版本只需要处理关于奖励剩余金额是大于还是小于剩余金额的逻辑。

答案 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时,它也会计算所有负面交易,产生了一些与你的概念相近的东西。