从2个表中计算高分的排名

时间:2010-09-07 16:31:00

标签: sql mysql ranking rank

我有一个琐事游戏,我想奖励用户2个事件:
1)正确回答
2)向问题池发送问题

我想查询特定玩家的得分和排名,并使用此查询:

SELECT (correct*10+sent*30) AS score, @rank:=@rank+1 AS rank 
FROM   (  trivia_players 
          JOIN (  SELECT COUNT(*) AS sent, senderid 
                  FROM trivia_questions 
                  WHERE senderid='$userid'
               ) a 
          ON trivia_players.userid=a.senderid
       )  
       ORDER BY score DESC

如果玩家在两个表中,即正确回答并发送问题,它就有效。 但如果玩家没有发送问题则无效

知道如何修复此查询吗? ($ userid是给定的参数)

谢谢!

谢谢汤姆!唯一的问题是排名不正确:
 userid得分等级
  58217 380 1
  12354 80 3
 32324 0 2

2 个答案:

答案 0 :(得分:1)

我可能会这样做:

SELECT
    user_id,
    score,
    rank
FROM
(
    SELECT
        TP.user_id,
        (TP.correct * 10) + (COUNT(TQ.sender_id) * 30) AS score,
        @rank:=@rank + 1 AS rank
    FROM
        Trivia_Players TP
    LEFT OUTER JOIN Trivia_Questions TQ ON
        TQ.sender_id = TP.user_id
    GROUP BY
        TP.user_id,
        TP.correct
    ORDER BY
        score DESC
) AS SQ
WHERE
    SQ.user_id = $user_id

我不太使用MySQL,所以语法可能不完美。我认为你可以在MySQL中使用这样的子查询。假设MySQL仅通过计算具有非空值的行来处理COUNT(),这应该可行。

关键是您在Trivia Questions的非空列上执行COUNT,以便用户对它们进行计数,并且您需要使用子查询,以便在约束特定用户之前为每个人获取排名标识。

答案 1 :(得分:0)

您是否尝试过使用 RIGHT JOIN LEFT JOIN ?就在我的头顶!