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

时间:2015-11-15 13:08:18

标签: php sql

抱歉天真的问题。我不能用句子说出我的问题,而应该解释一下。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于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;