【问题标题】:MySQL: Last 10 entries per user?MySQL:每个用户的最后 10 个条目?
【发布时间】:2010-01-12 01:57:33
【问题描述】:

我有一个存储用户事务数据的表。要查找用户评分,您可以取该用户最后 10 个条目的平均分数。有没有办法用 SQL 来实现?

我需要能够为给定 ID 的单个用户解决此问题。并获取按分数排序的所有用户的列表。

目前我正在 MySQL 之外解决它并将它存储在另一个列中,以便我可以为每个用户订购。

# returns average for all transactions.
SELECT user_id, AVG(score) FROM transactions WHERE user_id = 1
# returns scores for last 10 transactions.
SELECT user_id, score FROM transactions WHERE user_id = 1 ORDER_BY date DESC LIMIT 10

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • Ver 14.12 Distrib 5.0.45

标签: sql mysql aggregate average


【解决方案1】:

用途:

  SELECT x.user_id,
         AVG(x.score)
    FROM (SELECT t.user_id,
                 t.score
            FROM TRANSACTIONS t
           WHERE t.user_id = ?
        ORDER BY t.date
           LIMIT 10) x
GROUP BY x.user_id

【讨论】:

  • 成功!所以你 SELECT FROM 一个子查询而不是一个表。我会尝试弄清楚如何获得所有玩家的分数,我想如果需要的话,问一个单独的问题就可以了。
  • 对所有用户执行此操作的唯一方法是使用排名,这是 MySQL 所没有的。您可以使用变量来提供伪排名。
【解决方案2】:

只需组合两个已经在使用的查询:

SELECT user_id, AVG(score)
FROM transactions
WHERE rowid in (
    SELECT rowid
    FROM transactions
    WHERE user_id = 1
    ORDER_BY date DESC
    LIMIT 10)

其中rowid 是识别ID。是。

【讨论】:

  • 谢谢,看起来很有希望,但是... #1235 - 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME subquery' 如果我不能,我可能需要升级找到更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2014-11-18
  • 2013-11-04
  • 2016-11-17
相关资源
最近更新 更多