我有一个查询,其结果如
id | productid | userid | coinsid
1 | 2 | 2 | 5
3 | 2 | 2 | 6
4 | 2 | 3 | 7
5 | 2 | 4 | 8
6 | 2 | 3 | 9
这是特定productid
的结果。现在我必须通过向上述结果中的所有用户添加$ 1来更新user table
中的余额,但如果userid
是两次,我需要将两次$ 1添加到该特定用户的余额中。因此,在上述情况下,$ 1两次添加到userid=2
余额和userid=3
余额。
简单的方法是为每个不同的userid
计算记录,并在foreach
循环中让用户多次运行查询。但我正在寻找一些优化方式。请建议任何。感谢
答案 0 :(得分:4)
一种方法:
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子句中)决定了用户表中选择/影响的行。
答案 1 :(得分:1)
假设您的余额表中没有重复的用户ID,可能会这样:
update balance_table set balance_table.balance = (select count(*) from users_table where users_table.user_id = balance_table.user_id) * 1;
我没有尝试过对mysql数据库的查询,因为我对plsql比较熟悉,但不会有这样的工作吗?
答案 2 :(得分:1)
另一个答案中的相关子查询将起作用,但INNER JOIN通常会更有效。尝试这样的事情;你当然需要提供表名和列名。
UPDATE myTable
INNER JOIN (
SELECT userid, count(*) AS AmountToAdd
FROM users
GROUP BY userid
) UserCounts ON myTable.userid = UserCounts.userid
SET balance = balance + UserCounts.AmountToAdd
答案 3 :(得分:0)
select count(*), userid from yourTable group by userid
如果我理解你的问题。