如何在MySQL中对相同权重的记录进行排名

如何在MySQL中对相同权重的记录进行排名,mysql,mysql-variables,Mysql,Mysql Variables,假设我有一个数据,比如: Name | Marks StudentA | 90 StudentB | 85 StudentC | 85 StudentD | 70 现在学生A将获得第一名,学生B和学生C将获得第二名,学生D将获得第四名 如果没有重复的权重,我知道基本的秩计算,但是如果我们遇到两个类似的权重,如何处理,因为在本例中,有两个85标记将共享秩2。在php中,您可以通过以下方式实现它: $data = [ [95, 0], [85, 0], [85, 0], [8

假设我有一个数据,比如:

  Name   | Marks   
StudentA | 90
StudentB | 85
StudentC | 85
StudentD | 70
现在学生A将获得第一名,学生B和学生C将获得第二名,学生D将获得第四名


如果没有重复的权重,我知道基本的秩计算,但是如果我们遇到两个类似的权重,如何处理,因为在本例中,有两个85标记将共享秩2。

在php中,您可以通过以下方式实现它:

$data = [
    [95, 0], [85, 0], [85, 0], [85, 0], [70, 0], [70, 0], [50, 0]
];

$rank = 0;
$previous = null;
$skippedRank = 0;
foreach ($data as &$item) {
    if ($item[0] != $previous) {
        $rank += $skippedRank+1;
        $previous = $item[0];
        $skippedRank = 0;
    } else {
        $skippedRank++;
    }

    $item[1] = $rank;
}

print_r($data);

其中,$item[0]是权重,$item[1]是秩。

在php中,可以通过以下方式实现它:

$data = [
    [95, 0], [85, 0], [85, 0], [85, 0], [70, 0], [70, 0], [50, 0]
];

$rank = 0;
$previous = null;
$skippedRank = 0;
foreach ($data as &$item) {
    if ($item[0] != $previous) {
        $rank += $skippedRank+1;
        $previous = $item[0];
        $skippedRank = 0;
    } else {
        $skippedRank++;
    }

    $item[1] = $rank;
}

print_r($data);

其中,$item[0]是权重,$item[1]是秩。

您可以使用其他变量来保存上一条记录的标记:

选择名称、标记、, @rnk:=IF@prevMark=标记,@rnk, IF@prevMark:=分数,@rnk+1,@rnk+1为等级 从mytable 交叉连接选择@rnk:=0、@prevMark:=0作为变量 按唛头订货
您可以使用其他变量来保留上一条记录的标记:

选择名称、标记、, @rnk:=IF@prevMark=标记,@rnk, IF@prevMark:=分数,@rnk+1,@rnk+1为等级 从mytable 交叉连接选择@rnk:=0、@prevMark:=0作为变量 按唛头订货
用Giorgos的小提琴

SELECT name
     , marks
     , FIND_IN_SET(marks, (SELECT GROUP_CONCAT(marks ORDER BY marks DESC) FROM mytable)) rank
  FROM mytable;

|     Name | Marks | rank |
|----------|-------|------|
| StudentA |    90 |    1 |
| StudentB |    85 |    2 |
| StudentC |    85 |    2 |
| StudentD |    70 |    4 |


用Giorgos的小提琴

SELECT name
     , marks
     , FIND_IN_SET(marks, (SELECT GROUP_CONCAT(marks ORDER BY marks DESC) FROM mytable)) rank
  FROM mytable;

|     Name | Marks | rank |
|----------|-------|------|
| StudentA |    90 |    1 |
| StudentB |    85 |    2 |
| StudentC |    85 |    2 |
| StudentD |    70 |    4 |


你目前的成绩如何?你是怎么得到它的?你想要的结果是什么?我使用一个变量,然后每次递增1,但是数据中有两个85共享同一个秩,那么如何处理呢?你真正想要的是什么?如果权重相等,我希望秩应该共享,就像这里的85,studentB和studentC将共享同一等级,即2显示您当前的代码…您当前的结果是什么?你是怎么得到它的?你想要的结果是什么?我使用一个变量,然后每次递增1,但是数据中有两个85共享同一个秩,那么如何处理呢?你真正想要的是什么?如果权重相等,我希望秩应该共享,就像这里的85,studentB和studentC将共享同一级别,即2显示您当前的代码…谢谢您的回答,但我需要MySQL。@Komalsarvaya如果您不感兴趣,为什么要用PHP标记该问题?谢谢您的回答,但是我需要MySQL。@Komalsarvaya如果你对这个问题不感兴趣,为什么要用PHP来标记它?Giorgos的学生应该保持第四等级而不是第三等级,因为第二等级由两个人共享。Giorgos的学生应该保持第四等级而不是第三等级,因为第二等级由两个人共享。