如何使用MySQL查询和PHP分发排名

如何使用MySQL查询和PHP分发排名,php,mysql,sql,Php,Mysql,Sql,我必须在一次考试中给5000名学生分配排名。排名基于分数和获得该分数所用的时间(以秒为单位) 例如,如果5名学生的成绩相同,则应以分数作为计算其等级的标准,否则,分数应作为计算其等级的标准 下面是我的表 现在,上表中的排名列应更新为: ID StudID Score Time Date Rank 1 11 8 60 09-11-2013 2 2 22 6 45 09-11-2013 3 3 33 4

我必须在一次考试中给5000名学生分配排名。排名基于分数和获得该分数所用的时间(以秒为单位)

例如,如果5名学生的成绩相同,则应以分数作为计算其等级的标准,否则,分数应作为计算其等级的标准

下面是我的表

现在,上表中的排名列应更新为:

ID  StudID  Score Time Date        Rank
1   11      8     60   09-11-2013  2
2   22      6     45   09-11-2013  3
3   33      4     76   09-11-2013  5
4   44      6     67   09-11-2013  4
5   55      8     35   09-11-2013  1
6   66      8     35   08-11-2013  1
7   77      8     39   08-11-2013  2
我想做一个MySQL查询来做这项业务。同样,表中可能有10000多条记录。因此,我需要为这个功能优化查询

注意:我使用的是PHP和MYSQL


更新:每天几乎有5000个新条目将在表中创建,在所有插入操作完成后,排名列将每天更新一次。现在请告诉我最好的方法。如果我更新表中的排名列,则只需更新一次,否则每次获取学生排名时,我都必须进行计算。

因此,这是您的表:

ID  StudID  Score Time
1   11      8     60 
2   22      6     45 
3   33      4     76
4   44      6     67
5   55      8     35 
这是用于构建排名的查询:


它将“重新排列”表中得分最高、时间最快的行,并将从上到下排列

如果要更新表,可以执行以下操作:

更新TBT等级 内连接 选择ID、StudID、Score、`Time`、@rownum:=@rownum+1作为排名 从…起 选择ID、StudID、Score、`Time` 来自tbRank 其中date=datenow 按分数顺序描述,`time`ASC A. 参加 选择@rownum:=0 R b上的b.id=t.id 设置t.rank=b.rank 但由于您每天都要这样做,所以在执行此操作之前,必须将所有列的行更新为null

我不建议使用这种方法,因为如果您更改其中一个或插入新记录,则必须再次进行更新

只要您想获得排名,就可以使用此查询:

选择ID、StudID、Score、`Time`、@rownum:=@rownum+1作为排名 从…起 选择ID、StudID、Score、`Time` 来自tbRank 其中date=datenow 按分数顺序描述,`time`ASC A. 参加 选择@rownum:=0 R 此外,如果您想知道特定学生的排名,可以执行以下查询:

从中选择* 选择ID、StudID、Score、`Time`、@rownum:=@rownum+1作为排名 从…起 选择ID、StudID、Score、`Time` 来自tbRank 其中date=datenow 按分数顺序描述,`time`ASC A. 参加 选择@rownum:=0 R B 其中b.StudID=11;
嗯,我很抱歉。我已经在mysql中尝试过了。所以我有了解决方案。您在这里包含了php,所以问题是排名列将是表中的一个附加列,或者只是php中的一个显示?@DrixsonOseña-说实话,我不知道该怎么做?我是在表中保留一列,还是只在运行时计算它以显示在wep页面上?我需要建议。@nkp正如我在回答中提到的,列的排名的缺点是,无论何时输入新记录或修改现有记录,您都必须再次进行更新,因为您必须重新计算才能使表准确。如果从我的第二个查询中删除该列并只执行排名,则不必担心表,只要需要获得排名,就可以为其执行选择。@FilipeSilva-我对您的第二个查询感到满意。但根据我的要求,表一天只更新一次。我忘了在我的表中提到日期字段。我的查询,我必须考虑日期也我,E更新排名,日期是今天。我正在更新我的问题。这将根据我的需要对我的表进行排序。排名栏呢?我必须给每个学生排名。若你们想这样,排名栏必须是别名。见@Filipe Silva的回答。我认为这是一个适合你的解决方案
ID  StudID  Score Time
1   11      8     60 
2   22      6     45 
3   33      4     76
4   44      6     67
5   55      8     35 
SELECT * FROM tbRank GROUP BY Score DESC, Time ASC