Mysql
MYSQL 根據每個使用者的前 10 條記錄更新數據
我有一張桌子
users
和其他桌子user_scores
。在user_scores
中,我根據算法保存每個使用者的每日得分。現在我想user_score
通過只考慮表user_score
中最新的 10 條記錄來計算 AVGuser_scores
。我嘗試了以下兩個查詢,但沒有成功。UPDATE user SET user.user_score = ( SELECT AVG(score) as avg_score FROM ( SELECT score FROM user_scores WHERE user_id = user.id ORDER BY id DESC LIMIT 0,10)as x)
我面臨錯誤
Unknown column 'user.id' in 'where clause'
因為我無法將變數傳遞給查詢的子查詢
- 我通過 JOIN 嘗試過的其他事情,但在 JOIN 中,我無法根據最新的 10 條記錄計算每個使用者的 AVG(分數)。
請建議。
我可能有一個解決方案,但首先請看看這是否正確計算了 avg_scores:
SELECT user_id, AVG(score) AS avg_score FROM ( SELECT @prev := 0, @n := 0 ) init JOIN ( SELECT @n := if(user_id != @prev, 1, @n + 1) AS n, @prev := user_id, user_id, score, id FROM user_scores ORDER BY user_id DESC, id DESC ) x WHERE n <= 10 GROUP BY user_id;
推薦
INDEX(user_id, id, score)
上user_scores
。如果可行,那麼多表
UPDATE
可能會完成任務:UPDATE user JOIN ( the above ) AS y USING(user_id) SET user.user_score = y.avg_score;
我創建了一個函式來處理這部分,這樣我可以將值傳遞給函式並從函式中獲取 user_score