很抱歉问了这个幼稚的问题。我不能用一句话来说明我的问题,我应该解释一下。
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;