id | productid | userid | coinsid
1 | 2 | 2 | 5
3 | 2 | 2 | 6
4 | 2 | 3 | 7
5 | 2 | 4 | 8
6 | 2 | 3 | 9
这是特定产品的结果.现在我必须通过向上述结果中的所有用户添加$1来更新用户表中的余额,但如果userid是两次,我需要将两次$1添加到该特定用户的余额.所以在上面的情况下,$1两次添加到userid = 2 balance和userid = 3 balance.
简单的方法是为每个不同的用户ID计算记录,并在foreach循环中使用多个时间运行查询.但我正在寻找一些优化方式.请建议任何.谢谢
解决方法:
一种方法:
UPDATE user_table u
JOIN ( SELECT q.userid
, SUM(1.00) AS deposit
FROM (
-- original OP query goes here
) q
GROUP BY q.userid
) r
ON r.userid = u.userid
SET u.balance = u.balance + r.deposit
我们使用返回显示的结果集的原始OP查询,并使其成为内联视图(在上面的查询中别名为q).
从那里,我们查询userid的不同列表,以及userid在结果集中出现的次数.这给了我们用户名和存款金额(每次出现用户ID时1美元)(某些数据库可能希望我们将值指定为1.0而不是1,以确保它是十进制的.我认为SUM更具代表性我们正在努力实现的目标.)
我们将内联视图(r)加入到用户表中,并将存款金额添加到该用户的当前余额中(假设余额存储为十进制美元(1.00 = 1美元)
要进行测试,请将UPDATE转换为SELECT语句:
>删除“SET”子句
>添加“ORDER BY”子句(可选)以确定结果
>删除“UPDATE”关键字并替换它
有:
SELECT r.userid
, r.deposit
, u.balance AS old_balance
, u.balance + r.deposit AS new_balance
, u.userid
FROM
全选:
SELECT r.userid
, r.deposit
, u.balance AS old_balance
, u.balance + r.deposit AS new_balance
, u.userid
FROM user_table u
JOIN ( SELECT q.userid
, SUM(1.00) AS deposit
FROM (
-- original OP query goes here
) q
GROUP BY q.userid
) r
ON r.userid = u.userid
注意没有WHERE子句,JOIN谓词(在ON子句中)决定了在用户表中选择/影响哪些行.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。