mysql查询需要优化

沙赫扎德·汗(M Shahzad Khan)

我有一个查询,给出的结果像

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=2余额和userid=3余额中。

简单的方法是对每个不同的记录进行计数,userid并在有用户foreach循环的情况下运行查询但是我正在寻找一些优化方法。请提出任何建议。谢谢

spencer7593

一种方法:

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美元)


要进行测试,请将转换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子句中)是确定在用户表中选择/影响哪些行的因素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章