mysql查询需要优化

时间:2013-08-16 19:59:15

标签: php mysql

我有一个查询,其结果如

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循环中让用户多次运行查询。但我正在寻找一些优化方式。请建议任何。感谢

4 个答案:

答案 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

如果我理解你的问题。