我正在开发一个操纵大学生考试成绩的数据库。基本上,我正在从MySql数据库中提取记录,在任何给定时间都会激活一个类。我想对学生进行排名,表现最好的是1号。
我试着阅读这篇文章,但它只显示单个数组:
http://stackoverflow.com/questions/6163225/how-do-i-rank-array-values-with-duplicate-values-and-skipping-some-positions-if
这是一个例子;
获取结果和make和数组
$grades = array();
foreach($results->result() as $row){
$grades[] = array('rank'=>$row->total,'name'=>$student_name);
}
数组结果:
$grades[] = array(
array('rank'=>"123","name"=>"samphors"),
array('rank'=>"123","name"=>"sovann"),
array('rank'=>"102","name"=>"dy vann"),
array('rank'=>"113","name"=>"koro vann")
);
所以我想将Mysql数据捕获为多个数组。一旦我有一个数组中的数据,我应该为每个学生分配一个位置,如1/10(数字1,123得分),4/10等。现在的问题是,如果有一个平局,然后下一个分数跳过一个位置,如果在一个位置有3个分数,则下一个分数跳过2个位置。所以上面的分数排名如下;
----------------------------------
| no | name | score | rank |
| 1 |samphors | 123 | 1 |
| 2 |sovann | 123 | 1 |
| 3 |koro vann | 113 | 2 |
| 4 |dy vann | 102 | 3 |
----------------------------------
是否有可能(人类可能/ php可能)使用PHP对上述学生的分数和名称进行排名,以便能够处理可能的关系,例如在一个位置获得4分?很可能,我无法想出这样做的功能。我需要一个PHP函数(或者某些东西...... PHP)来获取数组并产生如上所述的排名。
任何帮助都将深表感谢,不过我认为我可能会要求太多。如果可以使用MySQL查询数据执行此操作而不将其放入数组中,那么这也会有所帮助!
答案 0 :(得分:0)
您应该将您的mysql查询更改为
SELECT * FROM `your table name` ORDER BY `rank` ASC
答案 1 :(得分:0)
这将处理具有相同分数的排名。基本上你必须在查询中做到这一点。
SELECT d.*, c.ranks
FROM
(
SELECT Score, @rank:=@rank+1 Ranks
FROM
(
SELECT DISTINCT Score
FROM tableName a
ORDER BY score DESC
) t, (SELECT @rank:= 0) r
) c
INNER JOIN tableName d
ON c.score = d.score
答案 2 :(得分:0)
我的PHP解决方案。
这要求您的结果按score ASC
排序。
<?php
// Start array
$grades = array(
array('score' => "123", "name" => "samphors"),
array('score' => "123", "name" => "sovann"),
array('score' => "113", "name" => "koro vann"),
array('score' => "102", "name" => "dy vann")
);
$i = 0;
$prevScore = 0;
foreach ( $grades as &$grade ) {
// Increment rank only if scores different
if( $grade[ 'score' ] != $prevScore ){
$i++;
}
$prevScore = $grade[ 'score' ];
$grade[ 'rank' ] = $i;
}
echo '<pre>';
print_r($grades);
echo '</pre>';
?>
输出:
Array
(
[0] => Array
(
[score] => 123
[name] => samphors
[rank] => 1
)
[1] => Array
(
[score] => 123
[name] => sovann
[rank] => 1
)
[2] => Array
(
[score] => 113
[name] => koro vann
[rank] => 2
)
[3] => Array
(
[score] => 102
[name] => dy vann
[rank] => 3
)
)