我有一组用户执行他们得分的任务。我正在尝试创建一个报告,显示每个用户过去50个任务的平均值。
用户表:userid,username,usertype
任务表:taskid,score,tasktype,userid
如果我这样做:
SELECT u.userid, u.username, (SELECT AVG(score)
FROM task t
WHERE t.userid = u.userid AND t.tasktype = 'task1'
ORDER BY t.taskid DESC LIMIT 50) AS avgscore
FROM user u
WHERE u.usertype = 'utype';
不起作用,因为它在达到所有内容的平均值后达到限制50。
我需要的是:
SELECT u.userid, u.username, AVG(SELECT t.score
FROM task t
WHERE t.userid = u.userid AND t.tasktype = 'task1'
ORDER BY t.taskid DESC LIMIT 50) AS avgscore
FROM user u
WHERE u.usertype = 'utype';
但这不是有效的语法
我已经尝试过子查询,但也不能这样做,因为当我在子子查询中引用u.userid时,我总是遇到限制,连接或未知字段的问题
有办法做到这一点吗?
答案 0 :(得分:0)
试试这个
SELECT u.userid, u.username, AVG(t.score ) AS avgscore
FROM user u
INNER JOIN task t
ON t.userid = u.userid
WHERE u.usertype = 'utype' AND t.tasktype = 'task1'
GROUP BY u.userid
ORDER BY t.taskid DESC LIMIT 50;
答案 1 :(得分:0)
在子查询中使用子查询:
SELECT u.userid, u.username,
(SELECT AVG(score)
FROM (select t.*
from task t
WHERE t.userid = u.userid AND t.tasktype = 'task1'
ORDER BY t.taskid DESC
LIMIT 50
) t
) AS avgscore
FROM user u
WHERE u.usertype = 'utype';
编辑:
我没有意识到MySQL不会识别u.userid
。它应该根据ANSI规则来确定表别名的范围。
您可以采用不同的方法找到第50个taskid值,然后取出上面的所有内容:
select ut.userid, ut.username, avg(t.score)
from (SELECT u.userid, u.username,
(SELECT substring_index(substring_index(group_concat(taskid order by taskid desc
), ',', 50), ',', -1)
from task t
WHERE t.userid = u.userid AND t.tasktype = 'task1'
) + 0 as taskid50
FROM user u
WHERE u.usertype = 'utype'
) ut join
task t
on ut.userid = t.userid and
ut.taskid50 >= t.taskid and t.tasktype = 'task1'
group by ut.userid, ut.username;