Mysql

MYSQL 根據每個使用者的前 10 條記錄更新數據

  • December 20, 2021

我有一張桌子users和其他桌子user_scores。在user_scores中,我根據算法保存每個使用者的每日得分。現在我想user_score通過只考慮表user_score中最新的 10 條記錄來計算 AVG user_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'因為我無法將變數傳遞給查詢的子查詢

  1. 我通過 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

引用自:https://dba.stackexchange.com/questions/199978