MySQL 中不同值的总和
Sum for Distinct values in MySQL
我有3个table,结构如下。
这个table(称为contest_submissions
)存储提交和竞赛的关系。
ContestID | SubmissionID
1 1000
1 1001
1 1002
1 1003
第二个table(称为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
另一个 table(称为 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
,因为100
和40
来自同一个问题(具有相同的ProblemID
)。
我该怎么办?
顺便说一句,我正在使用 MySQL。
你可以尝试类似的方法:
select User, sum(MaxScore)
from
(
select User, ProblemID, max(Score) as MaxScore
from submissions
group by User, ProblemId
) as t
group by User
您可以使用嵌套查询 - 内部查询获取用户对每个问题的最佳答案,外部查询求和它们:
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
嗯。我认为有一种方法可以只用一个 group by
:
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;
我将此作为解决方案提供,因为在 submissions(user, ProblemId, score, submissionId)
上有一个索引,它应该比具有两个聚合的解决方案具有更好的性能。
我有3个table,结构如下。
这个table(称为contest_submissions
)存储提交和竞赛的关系。
ContestID | SubmissionID
1 1000
1 1001
1 1002
1 1003
第二个table(称为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
另一个 table(称为 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
,因为100
和40
来自同一个问题(具有相同的ProblemID
)。
我该怎么办?
顺便说一句,我正在使用 MySQL。
你可以尝试类似的方法:
select User, sum(MaxScore)
from
(
select User, ProblemID, max(Score) as MaxScore
from submissions
group by User, ProblemId
) as t
group by User
您可以使用嵌套查询 - 内部查询获取用户对每个问题的最佳答案,外部查询求和它们:
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
嗯。我认为有一种方法可以只用一个 group by
:
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;
我将此作为解决方案提供,因为在 submissions(user, ProblemId, score, submissionId)
上有一个索引,它应该比具有两个聚合的解决方案具有更好的性能。