[英]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.