具有SUM的SQL SUM组

时间:2015-12-23 15:54:30

标签: php mysql sql

我有这个结构表:

USER_ID | POINTS_BALANCE

10     |  180          
10     |  20               
10     |  100                 
10     |  120  

如何为所有这些用户更新points_balance字段,例如500:

select user_id, sum(points_balance)
from `user_points_table`
group by user_id
having SUM(points_balance) >= 400 && SUM(points_balance) <= 499

或者我可以为user_id having sum(points_balance)插入400到499之间的新行吗?

编辑:

例如:

select user_id, sum(points_balance)
from `user_points_table`
where user_id = 74
group by user_id
having SUM(points_balance) >= 400 && SUM(points_balance) <= 499

结果:

USER_ID | POINTS_BALANCE
74      |  434 <-- How can I update this result to 500?

3 个答案:

答案 0 :(得分:1)

由于您要向表中添加新行,因此一个选项是使用\app\src\main\res\values

\app\src\main\res\values-he

答案 1 :(得分:0)

您无法更新所导出的信息。如果您希望显示与您派生的数字不同的数字,则可以执行以下操作:

select 
  user_id, 
  case 
  when totals < 500 then 500 
  else totals 
  end as totals 
from (
  select user_id, sum(points_balance) as totals 
  from test 
  -- where user_id = 10
  group by user_id 
  having totals between 400 and 499
) t
-- where user_id = 10;

+---------+--------+
| user_id | totals |
+---------+--------+
|      10 |    500 |
+---------+--------+

如果结果

select user_id, sum(points_balance) as totals 
from test 
-- where user_id = 10
group by user_id 
having totals between 400 and 499;

+---------+--------+
| user_id | totals |
+---------+--------+
|      10 |    420 |
+---------+--------+

并且你希望将其提高到500,你知道500和420之间的差异是80.所以,插入一条新记录:

insert into test (user_id, points_balance) values (10, 80);

或者您可以将其中一条记录更新为:

update test set points_balance = points_balance + 80
where user_id = 10 and points_balance = 120;

接下来的问题 - 您将更新10个记录中的哪一个?我希望你有一个id来唯一标识每一行。如果有,请更新ID最低的行。如果您没有唯一标识每一行的字段,那么现在是创建一个此类字段的好时机。

为了一次性完成所有这些操作,您将构建一个存储过程或用PHP / Python /您喜欢的任何语言编写脚本。

答案 2 :(得分:0)

<强>已更新

据我了解您的问题,您正在寻找一种方法,通过添加差异将每个用户点数设置为最小值500。 因此,您的解决方案可能如下所示:

mysql> DELIMITER //;
-> CREATE PROCEDURE updateMinimum()
-> BEGIN
-> DECLARE u,s INT;
-> DECLARE cur CURSOR FOR
-> SELECT user_id, SUM(points) FROM user_points GROUP BY user_id;
-> OPEN cur;
-> read_loop: LOOP
->    FETCH cur INTO u,s;
->    IF s < 500 THEN
->        INSERT INTO user_points (user_id, points) VALUES (u, 500-s);
->    END IF;
-> END LOOP;
-> CLOSE cur;
-> END//
mysql> DELIMITER ;
mysql> CALL updateMinimum();

它会告诉你No data,但不介意 - 它就是诀窍。只需使用SELECT查看即可:

SELECT user_id, SUM(points) FROM user_points GROUP BY user_id;

您可以随时随地使用CALL updateMinimum()。 或者如果您不再需要它,可以通过DROP PROCEDURE updateMinimum();

将其删除