如何从sql查询中获取行的顺序


How to get the order of a row from sql query

很抱歉问了这个幼稚的问题。我不能用一句话来说明我的问题,我应该解释一下。

mysql数据库中有一个表,称为points。结构如下-

id  | user_id  |  quiz_id |  point  | time
----+----------+----------+---------+-------
  1 |    1     |    1     |   200   |  46
----+----------+----------+---------+-------
  2 |    2     |    1     |   120   |  35
----+----------+----------+---------+-------
  3 |    3     |    1     |   160   |  60
----+----------+----------+---------+-------
  4 |    1     |    2     |    50   |  60
----+----------+----------+---------+-------
  5 |    2     |    2     |   110   |  25
----+----------+----------+---------+-------
  6 |    3     |    2     |   150   |  38
----+----------+----------+---------+-------
  7 |    4     |    3     |   180   |  55
----+----------+----------+---------+-------
  8 |    2     |    4     |     0   |  34
----+----------+----------+---------+-------
  9 |    6     |    4     |    90   |  58
----+----------+----------+---------+-------
 10 |    3     |    5     |     0   |  60
----+----------+----------+---------+-------
 11 |    1     |    6     |   110   |  18
----+----------+----------+---------+-------
 12 |    8     |    6     |   150   |  23
----+----------+----------+---------+-------
 13 |    12    |    6     |   180   |  29
----+----------+----------+---------+-------

这是一个问答应用程序,允许用户在60秒内进行10个问题(每个正确答案20个)的问答。如果有人在给定的时间内完成了测试,那么休息时间将与用户积分相加。如果任何用户未能回答任何正确的问题,那么无论花费多少时间,该用户都将在该测试中获得零分。

用户可以参加多个测试,他们的分数将汇总在一起。

我能胜任这一部分。我使用的sql查询如下-

SELECT 
    `user_id`, 
    sum( 
        case 
            when 60 >= `time` then `point` + (60-`time`) 
            else `point` 
        end
    ) as point 
FROM `points` group by `user_id` order by point DESC

我得到的结果-

  user_id  |  point
-----------+---------
    1      |   416
-----------+---------
    2      |   290
-----------+---------
    3      |   332 
-----------+---------
    4      |   185 
-----------+---------
    6      |    92
-----------+---------
    8      |   187 
-----------+---------
   12      |   211 
-----------+---------

到目前为止一切都很顺利。现在,我只能从上面的查询中获得特定user_id的秩,比如user_id 6的顺序(按顺序为5)。

我并没有要求完整的工作答案,只是想找一个正确方向的指南,因为我找不到。如果任何指南需要服务器端编程,我会为我的应用程序使用PHP

感谢您的帮助。

TIA-

更新

如果有人需要完全相同的解决方案,我会发布我通过稍微修改@Gordon Linoff提供的答案得出的工作解决方案。

我想从上面的查询结果中得到user_id的排名。很明显,如果有人查看了排行榜,而他不在榜首,他至少应该看看自己的排名。

SELECT Q.rank FROM(
    SELECT p.*, (@rn := @rn + 1) as rank
        FROM (SELECT `user_id`, 
             sum(case when 60 >= `time` then `answer`*20 + (60-`time`) 
                      else `answer`*20
                 end) as point 
         FROM `points` 
         GROUP BY `user_id` 
         ORDER BY point DESC
    ) p CROSS JOIN
    (SELECT @rn := 0) params ) AS Q WHEE Q.user_id= 6

id为6的用户检索排名,结果如下所示-

  rank
-------
   5

谢谢你的帮助。

对于MySQL中的排名,变量可能是最简单的方法。以下是假设点值不同,如何获得所有用户的排名:

SELECT p.*, (@rn := @rn + 1) as rank
FROM (SELECT `user_id`, 
             sum(case when 60 >= `time` then `point` + (60-`time`) 
                      else `point` 
                 end) as point 
     FROM `points` 
     GROUP BY `user_id` 
     ORDER BY point DESC
    ) p CROSS JOIN
    (SELECT @rn := 0) params;