sql - 从 2 个表中计算高分排名

标签 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是给定的参数)

谢谢!

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

最佳答案

我可能会这样做:

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(),这应该可以工作。

关键是您对琐事问题中的非空列进行 COUNT 操作,以便由用户对它们进行计数,并且您需要使用子查询,以便您可以在限制特定用户之前获得每个人的排名id。

关于sql - 从 2 个表中计算高分排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660606/

相关文章:

MySQL 优化所有表?

php错误查询为空

mysql - 使用 Node 和 Mysql

MySQL替换ASCII字符

ranking - 投票算法: how to calculate rank?

python - 属性错误: 'function' object has no attribute 'encode' error when writing to MySQL database

mysql 计数结果在前几个月尚未出现

sql - select 语句列出范围内的数字

seo - 如果搜索引擎在我的网站上发现太多错误的关键字,是否会对我的排名有害?

r - 按频率排序唯一值