如何使用MySQL查询和PHP分发排名
我必须在一次考试中给5000名学生分配排名。排名基于分数和获得该分数所用的时间(以秒为单位) 例如,如果5名学生的成绩相同,则应以分数作为计算其等级的标准,否则,分数应作为计算其等级的标准 下面是我的表 现在,上表中的排名列应更新为:如何使用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
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