【问题标题】:Get top 5 records for user, average records and rank by averages获取用户的前 5 条记录、平均记录并按平均排名
【发布时间】:2018-05-12 08:32:10
【问题描述】:

我有一个包含分数的用户记录表(并且只需要获取成员用户)。我需要在这一年中为每个用户获取前 5 名的分数,平均分数并返回前 10 名用户。

注意:此外,用户必须至少有 5 个条目。

分数表:

user_id | score | date_submitted
   1       99     2017-11-07 22:00:00
   2       55     2017-10-33 11:33:35
   1       12     2017-09-33 11:33:35

用户表

 id | is_member
  1      1
  2      1
  3      0

这是我目前所拥有的:

SELECT s.user_id, 
(SELECT AVG(s.score) FROM score s2 WHERE s2.user_id = s.user_id ORDER BY score DESC LIMIT 5) gr 
FROM score s, users u 
WHERE u.id = s.user_id 
AND u.is_member = 1 
AND YEAR(s.date_submitted) = YEAR(CURDATE())
GROUP BY s.user_id 
HAVING COUNT(*) >= 5 
ORDER BY gr DESC LIMIT 10

这会返回:

1242 - 子查询返回多于 1 行

我知道这是子查询中的限制,我正在尝试弄清楚如何获取该用户的前 5 条记录。

【问题讨论】:

  • 你可以运行子查询并检查记录
  • 您能否添加更多示例数据或为两个表创建和插入查询以测试查询?这真的很有帮助。

标签: mysql sql average


【解决方案1】:

以下查询将计算每个会员用户当年的前(最高)5 分的平均值,并显示前 10 名用户:

SELECT     s.user_id, AVG(s.score) gr 
FROM       (select * from score s
            where YEAR(date_submitted) = YEAR(CURDATE())
            and
              (select count(*)
                     from score
                     where user_id = s.user_id
                     and   score>=s.score
              )<=5
           ) s                                     
INNER JOIN users u 
        ON u.id = s.user_id 
       AND u.is_member = 1 
GROUP BY   s.user_id 
HAVING     COUNT(*) >= 5 
ORDER BY   gr DESC 
LIMIT      10;

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您不需要子查询。我还建议使用join 语法:

    SELECT     s.user_id, AVG(s.score) gr 
    FROM       score s
    INNER JOIN users u 
            ON u.id = s.user_id 
           AND u.is_member = 1 
    WHERE      YEAR(s.date_submitted) = YEAR(CURDATE())
    GROUP BY   s.user_id 
    HAVING     COUNT(*) >= 5 
    ORDER BY   gr DESC 
    LIMIT      10
    

    【讨论】:

    • OP 希望根据每个用户的 5 个最高得分计算其平均得分。以上是查询正在计算用户的总体平均得分。
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多