Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql:对具有限制的子查询上的函数进行分组_Mysql_Subquery - Fatal编程技术网

mysql:对具有限制的子查询上的函数进行分组

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

我有一组用户,他们执行的任务都是对他们进行评分的。我试图创建一个报告,显示每个用户最近50项任务的平均值

用户表:用户ID、用户名、用户类型
任务表:任务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指定一个表。