2012-07-25 54 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)