如何使用PHP为得分相同的用户分配相同的排名? $check\u res=$con->query( “选择* 来自“结果” 其中school_session=“$session” 和Term='$Term' 和class='$class' 主观性=“$subjectID” 按平均价格订购); $score_ends=数组(1=>“st”,2=>“nd”,3=>“rd”,4=>“th”); $key_计数器=1; foreach($支票作为$value){ $key_计数器=$key_计数器++; 如果($RegNum==$value['StudentReg'])){ 如果($key_计数器 API,而不是连接的值感谢信息。我现在就开始讨论,$RegNum是什么,它是在哪里定义的?$RegNum是每个用户的唯一身份如果超过3人获得最高分数,应该怎么做?您的脚本可以打开。甚至您应该考虑在 MySqLII< 或 PDO< /COD> API,而不是连接的值感谢信息。我现在就开始研究,$RegNum是什么,它的定义在哪里?$RegNum是每个用户的唯一身份如果超过3人获得最高分数会发生什么?GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用其他的方式GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用任何其他方式哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,那么最好是“问一个新问题”,我们将从这里开始哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,最好是“问一个新问题”和w

如何使用PHP为得分相同的用户分配相同的排名? $check\u res=$con->query( “选择* 来自“结果” 其中school_session=“$session” 和Term='$Term' 和class='$class' 主观性=“$subjectID” 按平均价格订购); $score_ends=数组(1=>“st”,2=>“nd”,3=>“rd”,4=>“th”); $key_计数器=1; foreach($支票作为$value){ $key_计数器=$key_计数器++; 如果($RegNum==$value['StudentReg'])){ 如果($key_计数器 API,而不是连接的值感谢信息。我现在就开始讨论,$RegNum是什么,它是在哪里定义的?$RegNum是每个用户的唯一身份如果超过3人获得最高分数,应该怎么做?您的脚本可以打开。甚至您应该考虑在 MySqLII< 或 PDO< /COD> API,而不是连接的值感谢信息。我现在就开始研究,$RegNum是什么,它的定义在哪里?$RegNum是每个用户的唯一身份如果超过3人获得最高分数会发生什么?GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用其他的方式GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用任何其他方式哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,那么最好是“问一个新问题”,我们将从这里开始哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,最好是“问一个新问题”和w,php,sql,Php,Sql,上面的代码根据平均值对用户进行排名。在这方面效果很好。 但它并没有给平均分数相同的用户分配相同的排名。 例如 20-1 20-2 但我想要的是这个 20-1 20-1 21-3rd如果您运行的是MySQL 8.0,您可以使用窗口功能直接在数据库中进行排名: $check_res = $con->query( "SELECT * FROM `results` WHERE school_session='$session'

上面的代码根据平均值对用户进行排名。在这方面效果很好。 但它并没有给平均分数相同的用户分配相同的排名。 例如 20-1 20-2

但我想要的是这个 20-1 20-1
21-3rd

如果您运行的是MySQL 8.0,您可以使用窗口功能直接在数据库中进行排名:

$check_res = $con->query(
        "SELECT * 
        FROM `results` 
        WHERE school_session='$session' 
        AND Term='$term' 
        AND class='$class' 
        AND  subjectID='$subjectID' 
        ORDER BY Average DESC ");

$score_ends = array(1 => "st", 2 => "nd", 3 => "rd", 4 => "th");
$key_counter=1;
foreach ($check_res as $value) {
    $key_counters=$key_counter++;
    if($RegNum == $value['StudentReg']){
        if($key_counters < 4){
            echo $key_counters.$score_ends[$key_counters];
        }else{
            echo $key_counters.$score_ends[4];
        }
    }
}
rank()
为领带分配相同的号码


请注意,我将查询更改为使用参数,而不是在查询字符串中串联php变量:这既安全又高效。

如果您运行的是MySQL 8.0,则可以使用窗口函数直接在数据库中进行排名:

$check_res = $con->query(
        "SELECT * 
        FROM `results` 
        WHERE school_session='$session' 
        AND Term='$term' 
        AND class='$class' 
        AND  subjectID='$subjectID' 
        ORDER BY Average DESC ");

$score_ends = array(1 => "st", 2 => "nd", 3 => "rd", 4 => "th");
$key_counter=1;
foreach ($check_res as $value) {
    $key_counters=$key_counter++;
    if($RegNum == $value['StudentReg']){
        if($key_counters < 4){
            echo $key_counters.$score_ends[$key_counters];
        }else{
            echo $key_counters.$score_ends[4];
        }
    }
}
rank()
为领带分配相同的号码

请注意,我将查询更改为使用参数,而不是在查询字符串中串联php变量:这既安全又高效。

因此,代码中有一些地方不是最佳实践,或者有点混乱

  • 您应该在SQL查询中真正使用
    prepared
    语句。当使用用户派生的数据时,它们提供了更好的保护(不清楚您的搜索参数是来自用户输入还是来自其他代码)
  • 如果在双引号字符串中使用
    $variables
    ,最好使用
    {curly brates}
    来包含它们。它使用正确的变量解决了
    PHP
    的各种问题,并且使其更易于读取和维护
  • 正如其他人所说,您没有实际显示
    $Reg
    的来源-因此我在下面的代码中忽略了它
解决方案 表/数据 假设您的表中有以下数据

表格:结果

select r.*, rank() over(order by average desc) rn 
from results r
where 
    school_session = ?
    and term = ?
    and class = ?
    and  subjectid = ?
order by average desc
查询返回的排序数据

StudentReg | school_session | Term | class | subjectID | Average
-----------+---------------+------+-------+-----------+-------------
1          | 1022           | 3    | 37    | 66        | 121
2          | 1022           | 3    | 37    | 66        | 115
3          | 1022           | 3    | 37    | 66        | 129
4          | 1022           | 3    | 37    | 66        | 121
5          | 1022           | 3    | 37    | 66        | 121
6          | 1022           | 3    | 37    | 66        | 117
7          | 1022           | 3    | 37    | 66        | 129
8          | 1022           | 3    | 37    | 66        | 125
9          | 1022           | 3    | 37    | 66        | 120
10         | 1022           | 3    | 37    | 66        | 118
11         | 1022           | 3    | 37    | 66        | 125
12         | 1022           | 3    | 37    | 66        | 124
13         | 1022           | 3    | 37    | 66        | 125
14         | 1022           | 3    | 37    | 66        | 125
代码 我已将代码改编为使用
准备好的
语句

变量

select r.*, rank() over(order by average desc) rn 
from results r
where 
    school_session = ?
    and term = ?
    and class = ?
    and  subjectid = ?
order by average desc
大概这些都是在你的代码后面的某个地方声明的

StudentReg | school_session | Term | class | subjectID | Average
-----------+---------------+------+-------+-----------+-------------
2          | 1022           | 3    | 37    | 66        | 115
6          | 1022           | 3    | 37    | 66        | 117
10         | 1022           | 3    | 37    | 66        | 118
9          | 1022           | 3    | 37    | 66        | 120
1          | 1022           | 3    | 37    | 66        | 121
5          | 1022           | 3    | 37    | 66        | 121
4          | 1022           | 3    | 37    | 66        | 121
8          | 1022           | 3    | 37    | 66        | 125
12         | 1022           | 3    | 37    | 66        | 124
11         | 1022           | 3    | 37    | 66        | 125
13         | 1022           | 3    | 37    | 66        | 125
14         | 1022           | 3    | 37    | 66        | 125
3          | 1022           | 3    | 37    | 66        | 129
7          | 1022           | 3    | 37    | 66        | 129
mysqli

$session   = 1022;
$term      = 3;
$class     = 37;
$subjectID = 66;
谈话要点 因此,代码中有一些地方不是最佳实践,或者有点混乱

  • 您应该在SQL查询中真正使用
    prepared
    语句。当使用用户派生的数据时,它们提供了更好的保护(不清楚您的搜索参数是来自用户输入还是来自其他代码)
  • 如果在双引号字符串中使用
    $variables
    ,最好使用
    {curly brates}
    来包含它们。它使用正确的变量解决了
    PHP
    的各种问题,并且使其更易于读取和维护
  • 正如其他人所说,您没有实际显示
    $Reg
    的来源-因此我在下面的代码中忽略了它
解决方案 表/数据 假设您的表中有以下数据

表格:结果

select r.*, rank() over(order by average desc) rn 
from results r
where 
    school_session = ?
    and term = ?
    and class = ?
    and  subjectid = ?
order by average desc
查询返回的排序数据

StudentReg | school_session | Term | class | subjectID | Average
-----------+---------------+------+-------+-----------+-------------
1          | 1022           | 3    | 37    | 66        | 121
2          | 1022           | 3    | 37    | 66        | 115
3          | 1022           | 3    | 37    | 66        | 129
4          | 1022           | 3    | 37    | 66        | 121
5          | 1022           | 3    | 37    | 66        | 121
6          | 1022           | 3    | 37    | 66        | 117
7          | 1022           | 3    | 37    | 66        | 129
8          | 1022           | 3    | 37    | 66        | 125
9          | 1022           | 3    | 37    | 66        | 120
10         | 1022           | 3    | 37    | 66        | 118
11         | 1022           | 3    | 37    | 66        | 125
12         | 1022           | 3    | 37    | 66        | 124
13         | 1022           | 3    | 37    | 66        | 125
14         | 1022           | 3    | 37    | 66        | 125
代码 我已将代码改编为使用
准备好的
语句

变量

select r.*, rank() over(order by average desc) rn 
from results r
where 
    school_session = ?
    and term = ?
    and class = ?
    and  subjectid = ?
order by average desc
大概这些都是在你的代码后面的某个地方声明的

StudentReg | school_session | Term | class | subjectID | Average
-----------+---------------+------+-------+-----------+-------------
2          | 1022           | 3    | 37    | 66        | 115
6          | 1022           | 3    | 37    | 66        | 117
10         | 1022           | 3    | 37    | 66        | 118
9          | 1022           | 3    | 37    | 66        | 120
1          | 1022           | 3    | 37    | 66        | 121
5          | 1022           | 3    | 37    | 66        | 121
4          | 1022           | 3    | 37    | 66        | 121
8          | 1022           | 3    | 37    | 66        | 125
12         | 1022           | 3    | 37    | 66        | 124
11         | 1022           | 3    | 37    | 66        | 125
13         | 1022           | 3    | 37    | 66        | 125
14         | 1022           | 3    | 37    | 66        | 125
3          | 1022           | 3    | 37    | 66        | 129
7          | 1022           | 3    | 37    | 66        | 129
mysqli

$session   = 1022;
$term      = 3;
$class     = 37;
$subjectID = 66;


您的脚本已打开。甚至您应该考虑在<代码> MySqLII< <代码>或<代码> PDO< /COD> API,而不是连接的值感谢信息。我现在就开始讨论,
$RegNum
是什么,它是在哪里定义的?$RegNum是每个用户的唯一身份如果超过3人获得最高分数,应该怎么做?您的脚本可以打开。甚至您应该考虑在<代码> MySqLII< <代码>或<代码> PDO< /COD> API,而不是连接的值感谢信息。我现在就开始研究,
$RegNum
是什么,它的定义在哪里?$RegNum是每个用户的唯一身份如果超过3人获得最高分数会发生什么?GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用其他的方式GMB是的,但目前不使用8.0。我很快就会升级。但是现在请用任何其他方式哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,那么最好是“问一个新问题”,我们将从这里开始哇…太干净了!!谢谢兄弟。我也会听从你的建议。非常感谢史蒂文。我喜欢剧本的编排。但我还有一些问题要问ask@Green好的,什么问题?你的剧本很干净,它以更好的方式给了我想要的。但我仍然需要你的帮助。输出为:1st-21、1st-21、3rd-22。但是我想要这样的东西:1st-21,1st-21,2nd-22,而不是直接跳到第三,我想要它继续这个序列。请。谢谢你advance@Green那么下一个问题是什么?如果它与这个原创问题无关,最好是“问一个新问题”和w