【问题标题】:Help on a Complicated MySQL Query关于复杂的 MySQL 查询的帮助
【发布时间】:2010-11-13 02:05:22
【问题描述】:

三个表:UserQuestionAnswer

表 Answer 包含以下列:AnswerID、UserID、QuestionID 和 Score。

用户可以多次提交问题的答案。但在排名时,只应计算他在该问题上获得的最高分。

现在我需要获得排名(用户 ID,总分)。如何编写查询?

谢谢!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    首先选择得分最高的答案,然后计算总分。

    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
    

    【讨论】:

      【解决方案2】:

      我不确定您查询的完整上下文,但这样的事情应该会有所帮助:

      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 sum(max(score)), UserID from.... group by UserID, ProblemID
      【解决方案3】:

      如何使用这样的子查询:

      SELECT UserId, SUM(
      SELECT MAX(SCORE) FROM Answer a
      WHERE a.uestionId = q.questionId)
      FROM Question q
      WHERE q.userId = 1234
      Group by userid
      

      【讨论】:

        【解决方案4】:

        但是当只排名最高的时候 他在这个问题上获得的分数应该 被计算在内。

        基于此,我的理解是您希望每个用户的每个问题的最高分数,然后对他们进行排名

         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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          • 2021-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多