【发布时间】:2010-11-13 02:05:22
【问题描述】:
三个表:User、Question和Answer
表 Answer 包含以下列:AnswerID、UserID、QuestionID 和 Score。
用户可以多次提交问题的答案。但在排名时,只应计算他在该问题上获得的最高分。
现在我需要获得排名(用户 ID,总分)。如何编写查询?
谢谢!
【问题讨论】:
标签: mysql
三个表:User、Question和Answer
表 Answer 包含以下列:AnswerID、UserID、QuestionID 和 Score。
用户可以多次提交问题的答案。但在排名时,只应计算他在该问题上获得的最高分。
现在我需要获得排名(用户 ID,总分)。如何编写查询?
谢谢!
【问题讨论】:
标签: mysql
首先选择得分最高的答案,然后计算总分。
SELECT
UserID, SUM(Score) AS TotalPoints
FROM (
SELECT
UserID, QuestionID, MAX(Score) AS Score
FROM
Answer
GROUP BY
UserID, QuestionID
) AS sq
GROUP BY
UserId
【讨论】:
我不确定您查询的完整上下文,但这样的事情应该会有所帮助:
SELECT QuestionID, UserID, MAX(Score) FROM Answer GROUP BY UserID, QuestionID
编辑
根据 OP Comment,查询应该更像这样:
SELECT UserID, SUM(SELECT Max(Score) FROM Answer GROUP BY UserID, QuestionID) AS TotalScore GROUP BY UserID
说实话,我不确定子查询是否 100% 正确,因此您可能无法得到您想要的确切结果,但它的基本形式是正确的。
【讨论】:
如何使用这样的子查询:
SELECT UserId, SUM(
SELECT MAX(SCORE) FROM Answer a
WHERE a.uestionId = q.questionId)
FROM Question q
WHERE q.userId = 1234
Group by userid
【讨论】:
但是当只排名最高的时候 他在这个问题上获得的分数应该 被计算在内。
基于此,我的理解是您希望每个用户的每个问题的最高分数,然后对他们进行排名
SET @rank=0;
SELECT
UserId,
Sum(Points) as TotalPoints,
Rank
FROM
(
SELECT UserID,MAX(Score) as Points,(@rank:=@rank+1) as Rank from Answer
group by UserID,questionId
order by Points
) as d1
group by d1.UserId
【讨论】: