简体   繁体   English

获取用户的前 5 条记录、平均记录和平均排名

[英]Get top 5 records for user, average records and rank by averages

I have a table for user records that hold scores (and need to get only users that are members).我有一个用于保存分数的用户记录表(并且只需要获取成员用户)。 I need to get the top 5 scores for each user during this year, average the scores and return the top 10 users.我需要获取今年每个用户的前 5 个分数,平均分数并返回前 10 个用户。

NOTE: Also the user must have a minimum of 5 entries.注意:此外,用户必须至少有 5 个条目。

SCORE TABLE:分数表:

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

USER TABLE用户表

 id | is_member
  1      1
  2      1
  3      0

Here is what I have so far:这是我到目前为止所拥有的:

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

This returns:这将返回:

1242 - Subquery returns more than 1 row 1242 - 子查询返回超过 1 行

I understand that its the limit in the subquery, I am trying to figure out how to get the top 5 records for that user.我知道这是子查询中的限制,我想弄清楚如何获取该用户的前 5 条记录。

You don't need the subquery.您不需要子查询。 I would also suggest using the join syntax:我还建议使用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

Following query will calculate avg of current year's top(highest) 5 scores of each user who is member and display top 10 users:以下查询将计算每个会员用户的当年最高(最高)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;

Hope it helps.希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM