基于正确答题数对玩家排名:仅用QuizInfo与PlayerAnswers表可行吗?
基于两张表实现玩家答题排名:可行性与实现方案
可行性结论
完全可行。两张表通过QuestionID字段关联,能够将玩家提交的答案(PlayerAnswers.PlayerAnswerID)与对应题目的正确答案(QuizInfo.CorrectAnswerID)做匹配,统计每个玩家的正确答题数量,进而完成排名,仅用这两张表就能满足需求。
具体实现(SQL示例)
第一步:统计每个玩家的正确答题数
先关联两张表,筛选出玩家答案与正确答案一致的记录,再按玩家ID分组统计正确题数:
SELECT pa.PlayerID, COUNT(qi.QuestionID) AS CorrectCount FROM PlayerAnswers pa JOIN QuizInfo qi ON pa.QuestionID = qi.QuestionID WHERE pa.PlayerAnswerID = qi.CorrectAnswerID GROUP BY pa.PlayerID
注:玩家未回答的问题不会出现在PlayerAnswers中,所以这部分不会被统计,符合“仅计算已提交且正确的答案”的逻辑。
第二步:为玩家生成排名
根据正确题数排序后,用SQL的排名函数生成名次。常用两种排名逻辑:
- 普通排名:并列名次会占用后续名次(比如两个第1名,下一个是第3名),用
RANK()函数 - 密集排名:并列名次不占用后续名次(比如两个第1名,下一个是第2名),用
DENSE_RANK()函数
以下是完整的密集排名示例SQL:
SELECT PlayerID, CorrectCount, DENSE_RANK() OVER (ORDER BY CorrectCount DESC) AS PlayerRank FROM ( -- 子查询先统计每个玩家的正确题数 SELECT pa.PlayerID, COUNT(qi.QuestionID) AS CorrectCount FROM PlayerAnswers pa JOIN QuizInfo qi ON pa.QuestionID = qi.QuestionID WHERE pa.PlayerAnswerID = qi.CorrectAnswerID GROUP BY pa.PlayerID ) AS PlayerCorrectStats -- 最终按排名、玩家ID排序输出 ORDER BY PlayerRank, PlayerID;
补充说明
如果需要覆盖从未提交任何答案的玩家,但现有两张表中没有独立的玩家列表(所有玩家ID仅来自PlayerAnswers),那仅用这两张表无法统计这类玩家——因为他们在PlayerAnswers中没有记录。如果需求中的“所有玩家”仅指有答题记录的玩家,那上述方案完全适用。
内容的提问来源于stack exchange,提问作者Haiyan Jamali
相关产品推荐
相关产品推荐

