抱歉天真的问题。我不能用句子说出我的问题,而应该解释一下。
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
感谢您的帮助。
答案 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;