2015-10-18 69 views
0

所以我有2個表MYSQL AVG得分第一次嘗試3次不同的測試的 - 在GROUP BY

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

只是爲了澄清,一個用戶可以有一個給定的測試多個分數? – Strawberry

回答

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表。

1

嘗試使用它,而不是相關子查詢的子查詢和JOINWHERE子句中:

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; 
+0

謝謝@Mahmood,這太好了。我將如何獲得所有三個準確的AVG?我可以只帶AVG(r2.avgstore)嗎? –

+0

@TommyArnold - 你的意思是所有的測試?完成與否? –

+0

目前,上述查詢返回3行,我正在尋找與所有三個的平均值一行。 –