mysql - 如何按多个等级对表进行排序

标签 mysql rank

我在根据单个结果表创建和排序排行榜时遇到问题。这是我正在尝试做的一个简单示例;

table results;
 Name RaceNo Time
 Sam   1     34 
 Ben   1     27
 Sam   2     29
 Ken   1     30
 Ben   2     32
 Sam   3     35
 Ken   2     33
 Ken   3     38
 Ben   3     33

RaceNo=最多16个左右; 名称 = 最多 50 个左右;

我想得到如下排序的输出; 包含比赛行的输出,按总计排序

 Name R1 R2 R3 Total(sum R1-n)
 Ben  27 32 33   92
 Sam  34 29 35   98
 Ken  30 33 38  101

我真正想要的是; 期望的输出是每个比赛排名 1-n,以及 sum(Rank),其中行按 sum(Rank) 排序。

 Name Rnk1 Rnk2 Rnk3 Total(sum Rank1-n)
 Ben   1    2    1    4
 Sam   3    1    2    6
 Ken   2    3    3    8

我不知道如何解决这个问题。以下将对单个种族进行排名,但我不知道如何将所有种族串在一起到单个查询中。

select Name, find_in_set( Time, (select group_concat(Time order by Time) from 
results where RaceNo=1)) as rank from results where RaceNo=1;

这离我想要做的还很远。我正在考虑在 PHP 中循环,但我确信在 MySQL 中有更好的方法。 如果有人可以提供帮助,我将非常感激?

最佳答案

你已经完成了最大的部分:

这样,您就可以在一个平面列中拥有所有排名

  SELECT RaceNo, Name,
       FIND_IN_SET( Time,
              (SELECT GROUP_CONCAT(Time order by Time)
                   FROM results WHERE RaceNo=m1.RaceNo)) as rank 
  FROM results m1;

您只需更进一步即可获得特定比赛:

  SELECT m2.Name, SUM(IF(m2.RaceNo=1, m2.rank, 0)) R1
  FROM (SELECT RaceNo, Name, FIND_IN_SET( Time,
                (SELECT GROUP_CONCAT(Time order by Time)
                 FROM results 
                 WHERE RaceNo=m1.RaceNo)) as rank
        FROM results m1) m2 GROUP BY m2.Name;

因此,您可以执行以下操作生成所有比赛的查询

  ## generating the different columns
  SELECT CONCAT(GROUP_CONCAT(
            CONCAT("SUM(IF(m2.RaceNo=", RaceNo, ", m2.rank, 0)) R", RaceNo)),
            ", SUM(m2.rank) Total")
    INTO @query
    FROM (SELECT DISTINCT RaceNo FROM results ) m;

  ## inserting the columns in our previous request
  SELECT CONCAT("SELECT m2.Name, ", @query,
               " FROM (SELECT RaceNo, Name, FIND_IN_SET( Time,
                           (SELECT GROUP_CONCAT(Time order by Time)
                            FROM results WHERE RaceNo=m1.RaceNo)) as rank
                       FROM results m1) m2 GROUP BY m2.Name;")
    INTO @query;

  ## execute it as a statement
  mysql> PREPARE stmt FROM @query;
  mysql> EXECUTE stmt;
  +------+------+------+------+-------+
  | Name | R1   | R2   | R3   | Total |
  +------+------+------+------+-------+
  | Ben  |    1 |    2 |    1 |     4 |
  | Ken  |    2 |    3 |    3 |     8 |
  | Sam  |    3 |    1 |    2 |     6 |
  +------+------+------+------+-------+
  3 rows in set (0.00 sec)

关于mysql - 如何按多个等级对表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28623922/

相关文章:

mysql - mySQL 中的字段类型

具有非标识关系的 MySQL 外键

sql - 内置 SQL 函数的时间复杂度,例如 sum、count、avg

php - 检查复选框状态并基于它执行 PHP 查询

Php 跳过第一个 MySQL 行。不是常见的 double fetch() 错误

Mysql - 查询的排名字段

r - 基于多个列计算排名,具有优先规则

php - 如何使用 PHP 和 MySQL 显示学生在一百名学生中的排名?

python - Tensorflow:如何将 1 阶张量转换为 2 阶张量

sql - 在 MySQL 表中显示单个排名