3 种不同测试的首次尝试的 MYSQL 平均分数 - IN GROUP BY

标签 mysql sql database

所以我有两张 table

Users: id, name
Results: id, test_id, user_id, score

我需要获取用户第一次尝试对所有三个 test_id 的平均值。

用户可能尚未完成全部 3 项测试。

我这里的查询确实有效,但速度非常慢,有没有办法加快速度?

SELECT AVG(score) 
  FROM results 
 WHERE id IN(SELECT MIN(id) 
               FROM results 
               WHERE complete = 1 
               GROUP 
                  BY test_id)

最佳答案

此方法使用子查询来获取每个用户/测试组合的最小 ID。然后它连接回 results 以获取 score 并将其用于聚合:

SELECT u.*, AVG(r.score)
FROM user u LEFT JOIN
     (SELECT user, testid, MIN(id) as minid
      FROM results r
      WHERE complete = 1
      GROUP BY user_id, test_id
     ) ut
     ON ut.user_id = u.id LEFT JOIN
     results r
     ON r.id = ut.minid
GROUP BY u.id;

这会产生每个用户的平均值(这就是我解释问题的方式)。如果您想要每次测试的第一个测试的所有用户的平均值,请从查询中删除 group byuser 表。

关于3 种不同测试的首次尝试的 MYSQL 平均分数 - IN GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33196726/

相关文章:

mysql - 减去 MySQL 中 2 个特定行的值

c# - 将 datareader 值转换为可空变量

MySQL 报告 -- 填写空日期

带有用于多行插入的循环的 SQL Server 触发器

python - Django 按规则自动递增 IntegerField

sql - Count() 和 left join 问题

mysql - 有没有办法将 MySQL 的 JSON_EXTRACT 与 JSON 字符串中的整数键一起使用?

MySQL JOIN 忽略 NULL 值

javascript - 数据库中的字符串无法调用 Javascript

我的更新和插入语句中的 SQL 语法错误