Mysql 获取用户、平均记录和按平均值排名的前5项记录
我有一个用于保存分数的用户记录的表,并且只需要获取作为成员的用户。我需要获得今年每个用户的前5名分数,平均分数并返回前10名用户 注意:用户必须至少有5个条目 评分表:Mysql 获取用户、平均记录和按平均值排名的前5项记录,mysql,sql,average,Mysql,Sql,Average,我有一个用于保存分数的用户记录的表,并且只需要获取作为成员的用户。我需要获得今年每个用户的前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_memb
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条记录。您不需要子查询。我还建议使用连接语法:
以下查询将计算每位会员用户本年度前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;
希望有帮助。您可以运行子查询并检查记录吗?请添加更多样本数据或为两个表创建并插入查询以测试查询?这将非常有帮助。OP希望根据每个用户的5个最高分计算其平均得分。上面的查询正在计算用户的总体平均分数。
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;