计算MySQL中每个用户的平均消息质量
考虑下表:计算MySQL中每个用户的平均消息质量,mysql,Mysql,考虑下表: users messages ------------------- ---------------------- user_id avg_quality msg_id user_id quality ------------------- ---------------------- 1 1 1 1 2
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
消息。质量
为0
或1
。我需要计算每个用户的平均消息质量,并相应地更新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
请参见平均值函数: 您的选择应该如下所示:
select user_id, AVG(quality) from messages group by user_id
如果从空的users表开始,则可以运行类似以下的查询来更新它:
insert into users (user_id, avg_quality)
select m.user_id, coalesce(AVG(m.quality),0) from messages m group by m.user_id
如果您需要持续的结果,Luc的建议将适用于您:
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)
这应该起作用:
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的可能解决方案。请先检查内部选择查询。@Omesh-错误是我的…输入错误。谢谢你的帮助:)
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;