2012-07-25 82 views
2

考虑以下表:计算平均消息质量在MySQL

users     messages 
-------------------  ---------------------- 
user_id avg_quality  msg_id user_id quality 
-------------------  ---------------------- 
1      1  1  1 
2      2  1  0 
3      3  1  0 
         4  1  1 
         5  1  1 
         6  2  0 
         7  2  0 
         8  3  1 

messages.quality要么01。我需要计算每位用户的平均邮件质量并相应地更新users.avg_quality。因此,所需的输出将被修改users表所示:

users 
------------------- 
user_id avg_quality <-- DECIMAL (8,2) 
------------------- 
1  0.60   <-- (3x1 + 2x0)/5 
2  0.00   <-- (2x0)/2 
3  1.00   <-- (1x1)/1 

我开始我的查询是这样的,我知道的语法不正确,但有没有更好的主意。你做?

UPDATE messages m, users u 
SET avg_quality = (SELECT COUNT(m.msg_id)/SUM(m.quality)) 
WHERE m.user_id = u.user_id 
+2

你可能在一个运行做到这一点可能是,看到这个例如:http://计算器.com/questions/6209215/mysql-update-table-based-select-count-of-a-different-table当前发布的答案正在获取数据,但未更新用户表。 – 2012-07-25 10:06:09

回答

1

这应该工作:

UPDATE users u 
     INNER JOIN (SELECT a.user_id, AVG(quality) avg_quality 
        FROM messages a 
         INNER JOIN users b 
          ON a.user_id = b.user_id 
        GROUP BY a.user_id 
       ) tmp 
        ON u.user_id = tmp.user_id 
SET u.avg_quality = tmp.avg_quality; 
+0

谢谢,但如果我运行它,它会影响零行? – Pr0no 2012-07-25 10:10:36

+0

嗨,在我的文章中查看0的可能解决方案。 – mihaisimi 2012-07-25 10:14:12

+1

先检查内部选择查询。 – Omesh 2012-07-25 10:14:39

1

见的平均函数:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg

你的选择应该是这样的:

select user_id, AVG(quality) from messages group by user_id 

如果用一个空的用户表开始,你可以运行像查询这一个更新一切:

insert into users (user_id, avg_quality) 
select m.user_id, coalesce(AVG(m.quality),0) from messages m group by m.user_id 

如果您需要连续结果吕克的建议会为你工作:

update users u left join (
    select m.user_id, AVG(m.quality) as average from messages m group by m.user_id 
) as average_result_t on u.user_id = average_result_t.user_id 
set u.average = coalesce(average_result_t.average,0)