Handling ties when ranking from the highest to the lowest

前端 未结 2 1116
北荒
北荒 2021-01-26 00:39

I am trying to make a ranking manager for a small project.The totals are stored in the database.I can easily get the max and min using mysql and also arrange the records descend

相关标签:
2条回答
  • 2021-01-26 00:54
    $data = array(
      'A'=>19,'B'=>18,'C'=>17,'D'=>17,'E'=>16,'F'=>15
    );
    
    $rank = 0;
    $lastScore = PHP_INT_MAX;
    foreach( $data as $name=>$score ) {
      if ( $lastScore !== $score ) {
        $lastScore = $score;
        $rank += 1;
      }
      printf("%s %d (%d)\n", $name, $score, $rank);
    }
    

    prints

    A 19 (1)
    B 18 (2)
    C 17 (3)
    D 17 (3)
    E 16 (4)
    F 15 (5)
    
    0 讨论(0)
  • 2021-01-26 01:06

    Could you not just do that in SQL as well? The records with duplicate ranks will still get output, however the order within the tie will be undefined.

    SELECT id, rank FROM mytable ORDER BY rank ASC;
    

    Ah, looks like I misunderstood the question, thanks Matchu. This could still be achieved with a relatively simple SQL query. The key is using a subquery to count the distinct scores that have already passed.

    SELECT id, score, (
      SELECT COUNT(DISTINCT score) + 1 
      FROM mytable 
      WHERE score < outerscore.score 
      ORDER BY score ASC
    ) AS rank
    FROM mytable as outertable
    ORDER BY score ASC;
    
    0 讨论(0)
提交回复
热议问题