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

时间:2015-10-18 10:10:31

标签: mysql sql database

所以我有2张桌子

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)

2 个答案:

答案 0 :(得分:1)

尝试使用子查询和JOIN代替WHERE子句中的相关子查询:

SELECT
  r1.id,
  r2.test_id,
  r2.avgstore
FROM results AS r1
INNER JOIN
(
   SELECT test_id, MIN(id) AS MinId, AVG(Store) AS AvgStore
   FROM results 
   WHERE complete = 1 
   GROUP BY test_id
) AS r2 ON r1.id = r2.MinId AND r1.test_id = r2.test_id;

答案 1 :(得分:1)

此方法使用子查询来获取每个用户/测试组合的最小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表。