2016-05-08 53 views
4

我有三個表,結構如下所示。在MySQL中的不同值的總和

該表(稱爲contest_submissions)存儲提交和競賽的關係。

ContestID | SubmissionID 

1   1000 
1   1001 
1   1002 
1   1003 

第二個表(稱爲submissions)存儲提交的詳細信息:

SubmissionID | ProblemID | User | Score | Time 

1000   1000  A  100  1000 
1001   1000  A  40  1250 
1002   1001  A  50  1500 
1003   1001  B  20  1750 

另一個表(稱爲contest_contestants)是由以下組成:

ContestID | User 

1   A 
1   B 

我寫了下面SQL:

SELECT *, (
    SELECT SUM(score) 
    FROM contest_submissions cs 
    NATURAL JOIN submissions 
    WHERE user = cc.user 
    AND SubmissionID = cs.SubmissionID 
) AS TotalScore, (
    SELECT SUM(Time) 
    FROM contest_submissions cs 
    NATURAL JOIN submissions 
    WHERE user = cc.user 
    AND SubmissionID = cs.SubmissionID 
) AS TotalTime 
FROM contest_contestants cc 
WHERE contestID = 1 

我得到下面的結果(假設ContestID = 1):

contestID | User | Total Score | Total Time 
1   A  190   3750 
1   B  20   1750 

其中190 = 100 + 40 + 50

不過,我希望得到以下結果:

contestID | User | Total Score | Total Time 
1   A  150   2500 
1   B  20   1750 

其中150 = MAX(100, 40) + 50,因爲來自同一個問題10040(具有相同ProblemID)。

我該怎麼辦?

順便說一句,我正在使用MySQL。

回答

3

你可以嘗試這樣的事情:

select User, sum(MaxScore) 
from 
(
select User, ProblemID, max(Score) as MaxScore 
from submissions 
group by User, ProblemId 
) as t 
group by User 
+0

嗨,那裏。我更新了我的問題。如果我需要查詢中的更多信息,該怎麼辦? –

+0

我想你需要調整查詢 –

0

你可以使用一個嵌套查詢 - 內一個獲得用戶的最佳答案對每個問題和外一個來概括他們:

SELECT user, SUM(score) AS total_score 
FROM  (SELECT user, problemid, MAX(score) AS score 
      FROM  submission 
      GROUP BY user, problemid) t 
GROUP BY user 
+0

你需要使用'MAX(score)'這樣的別名作爲score'來訪問外部select中的值。 –

+0

@PaulSpiegel True dat。修正了,謝謝。 – Mureinik

1

嗯。我覺得有一種方法只有一個group by做到這一點:我因爲在submissions(user, ProblemId, score, submissionId)它應該比兩個集合的解決方案有些更好的性能指標提供這個作爲方案

select s.user, sum(s.score) 
from submissions s 
where s.submissionId = (select s2.submissionId 
         from submissions s2 
         where s2.user = s.user and s2.ProblemId = s.ProblemId 
         order by s2.score desc 
         limit 1 
         ) 
group by s.user; 

+0

在子查詢中需要第二個條件:'和s2.ProblemID = s.ProblemID'。 –

+0

嗨,那裏。我更新了我的問題。如果我需要查詢中的更多信息,該怎麼辦? –

+0

@PaulSpiegel。 。 。謝謝。 –