mysql:对具有限制的子查询上的函数进行分组
我有一组用户,他们执行的任务都是对他们进行评分的。我试图创建一个报告,显示每个用户最近50项任务的平均值 用户表:用户ID、用户名、用户类型mysql:对具有限制的子查询上的函数进行分组,mysql,subquery,Mysql,Subquery,我有一组用户,他们执行的任务都是对他们进行评分的。我试图创建一个报告,显示每个用户最近50项任务的平均值 用户表:用户ID、用户名、用户类型 任务表:任务ID、分数、任务类型、用户ID 如果我这样做: SELECT u.userid, u.username, (SELECT AVG(score) FROM task t WHERE t.userid = u.userid AND t.t
任务表:任务ID、分数、任务类型、用户ID 如果我这样做:
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时,我总是遇到限制、连接或未知字段的问题
有办法吗?试试这个
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;
在子查询中使用子查询:
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;
谢谢你的编辑-我以为我有这样的编辑,但是当我发布的时候它没有显示出来-你打败了我自己来修改它。不,那只返回一个userid/用户名和一个avg分数。我需要一个所有用户的列表,每个用户都有自己的最后50分。这仍然返回每个用户所有“task1”类型任务的平均分。要显示的用户数限制为50。我也尝试了这个限制,但在“where子句”中得到了“未知列'u.userid'。我甚至尝试在第二级添加第二个用户表以加入,但后来限制出现了问题-我这样做时似乎只在所有用户中获得50分。这仍然不起作用-现在它采用的是最小值的50分限制,而不是最小值的50分。这基本上是一个回到原始问题的圆,取最后50个平均值,而不是50个平均值。也许这在mysql中是不可能的,因为它无法识别子查询中的外部别名。@Inukshuk。嗯。如果它对
avg()
不起作用,它对min()
就不起作用。我试图避免我刚才的表述。但是有一种方法。如果taskid
是一个整数,那么您应该输入+1
将字符串转换回整数。我看到它,我读了它,我理解了它,然后我无法理解它为什么不起作用。然后我就可以了。它需要是t.taskid>=ut.taskid50(这个很简单);在该连接中,还缺少“ut.userid=t.userid”。使用CAST()可能比+1更好。谢谢你的帮助!我试着再做两次必要的小编辑,但他们还没有通过,所以我会把他们贴在这里。联接需要是t.taskid>=ut.taskid50,并且您需要在select和GROUPBY子句(ut.userid,ut.username)上至少为userid指定一个表。