所以我有两张 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 by
和 user
表。
关于3 种不同测试的首次尝试的 MYSQL 平均分数 - IN GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33196726/