所以我有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)
答案 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 by
和user
表。