繁体   English   中英

mysql:子查询上具有限制的组功能

[英]mysql: group functions on subqueries with limits

我有一群执行任务的用户。 我正在尝试创建一个报告,以显示每个用户最近50个任务的平均值。

用户表:userid,用户名,用户类型
任务表:taskid,得分,任务类型,用户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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM