MySQL - 如何确定按两列排序的表的位置排名并允许平局?

标签 mysql

我有一个表格(锦标赛),其中包含球队列表及其累积积分和净胜球(进球数 - 失球数)。

比赛

+-----------+--------+-----------+
|   team    | points | goal_diff |
+-----------+--------+-----------+
| USA       |      7 |   -2      |
| Brazil    |     12 |   +7      |
| Argentina |     12 |   +10     |
| Germany   |      7 |   -2      |
| Italy     |      3 |    0      |
+-----------+--------+-----------+

如何按积分排名,然后按净胜球排名,保持相同排名并跳过后续排名?我正在寻找产生此最终结果的查询:

+-----------+--------+-----------+------+
|   team    | points | goal_diff | rank |
+-----------+--------+-----------+------+
| Argentina |     12 | +10       |    1 |
| Brazil    |     12 | +7        |    2 |
| USA       |      7 | -2        |    3 |
| Germany   |      7 | -2        |    3 |
| Italy     |      3 | 0         |    5 |
+-----------+--------+-----------+------+

我已经能够对它们进行排名并通过分数列保持相同的关系,但不知道如何包含第二列条件

SELECT s.team, s.points, s.goal_diff,
    (( SELECT COUNT(DISTINCT points) FROM Tournament WHERE points > s.points ) + 1) AS rank
FROM Tournament s
ORDER BY s.points DESC

感谢您的帮助!

最佳答案

对于任何试图解决这个问题的人,我最终将我的数据库升级到 MariaDB 10.3.14 并使用了 RANK() 函数,它正是我所需要的。

代码如下:

SELECT team, points, goal_diff,
    RANK() OVER (
        ORDER BY
            points DESC,
            goal_diff DESC
        ) rank
FROM Tournament;

我知道升级数据库可能不是每个人的选择,但对我来说这是一个非常简单的解决方案。 希望对其他人也有帮助。

关于MySQL - 如何确定按两列排序的表的位置排名并允许平局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863540/

相关文章:

php - MySQL 事务与锁

Mysql帮助-左连接

按照 IN 条件传递的顺序获取 MySQL 记录

mysql - 如何在 Doctrine 中使用汇总修饰符进行分组?

PHP if 语句 mysqli_num_rows 不起作用

mysql - 错误 1064 (42000) 未能授予权限

java - 将 Java 日期转换为 MySql DateTime

phpMyAdmin 中的 MySQL "#2006 - MySQL server has gone away"

mysql - Sequelize.hasMany/belongsTo 中的外键是什么意思?

PHP MySQL 添加到长文本