5

我有一个查询,结果如下

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。现在我必须user table通过向上述结果中的所有用户添加 1 美元来更新余额,但如果userid是两次,我需要将 1 美元添加到该特定用户的余额中两次。所以在上面的例子中,$1 两次加到userid=2balance 和userid=3balance 中。

简单的方法是计算每个不同的记录userid并运行查询,因为我们有用户在foreach循环中。但我正在寻找一些优化方式。请提出任何建议。谢谢

4

4 回答 4

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)。

由此,我们查询一个不同的用户 ID 列表,以及该用户 ID 在结果集中出现的次数。这给了我们用户名和存款金额(每次用户 ID 出现时 1 美元)(一些数据库可能希望我们将值指定为 1.0 而不是 1,以确保它是十进制的。我认为 SUM 更能代表我们正在努力实现的目标。)

我们将该内联视图 ( r ) 加入到用户表中,并将存款金额添加到该用户的当前余额中(假设余额存储为十进制美元(1.00 = 1 美元)


要进行测试,请将 转换UPDATESELECT语句:

  • 删除“ 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 子句中)决定用户表中选择/影响哪些行。

于 2013-08-16T20:12:31.473 回答
1

假设您的余额表中没有重复的用户 ID,也许这样的事情会起作用:

update balance_table set balance_table.balance = (select count(*) from users_table where users_table.user_id = balance_table.user_id) * 1;

由于我对 plsql 更熟悉,所以我没有尝试对 mysql 数据库进行此查询,但是这样的事情不会起作用吗?

于 2013-08-16T20:03:57.530 回答
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
于 2013-08-16T20:08:11.263 回答
0
select count(*), userid from yourTable group by userid

如果我明白你的问题。

于 2013-08-16T20:03:44.033 回答