【问题标题】:MySQL (MariaDB) get row position in ORDER BYMySQL(MariaDB)在 ORDER BY 中获取行位置
【发布时间】:2020-09-21 06:28:03
【问题描述】:

首先,我已经看过这个post,但我无法让它工作。

所以我想通过一组参数来获取表格中一行的位置。例如。我有一张表,里面有各种统计数据。看起来像这样。

+-----------+-------+--------+------+--------------+
| player_id | kills | deaths | wins | played_games |
+-----------+-------+--------+------+--------------+
|         1 |     0 |      2 |    1 |            3 |
|         2 |     0 |      1 |    0 |            1 |
|         3 |     0 |      0 |    0 |            0 |
|         5 |     0 |      1 |    0 |            1 |
|        13 |     0 |      1 |    0 |            1 |
|        14 |     3 |      1 |    2 |            3 |
|        29 |     0 |      3 |    0 |            3 |
|        30 |     0 |      1 |    0 |            2 |
|        32 |     5 |      0 |    1 |            1 |
+-----------+-------+--------+------+--------------+

所以我想显示按胜利排序的玩家排名位置。 在此示例中,玩家 14 将是 Rank #1。

我可以做一个简单的 SELECT * FROM tbl ORDER BY wins ASC 然后枚举行,但是仅为单行加载可能很大的结果集似乎很浪费。

【问题讨论】:

标签: mysql sql select mariadb window-functions


【解决方案1】:

如果您运行的是 MariaDB 10.3 或更高版本,只想使用窗口函数:

select t.*, rank() over(order by wins desc) rn
from mytable t
order by wins desc

rank() 将相同的分数分配给获胜次数相同的玩家。

在早期版本中,一个模拟选项是相关子查询:

select
    t.*,
    (select count(*) + 1 from mytable t1 where t1.wins > t.wins) rn
from mytable t
order by wins desc

【讨论】:

  • 这个对我有用!随着一点点更多的研究。因为我想要一个 WHERE 子句,所以我想出了这个WITH rank AS ( SELECT t.wins,t.player_id, RANK() OVER(ORDER BY wins DESC) rn FROM `table_name` t ORDER BY wins DESC ) SELECT rn FROM rank WHERE player_id = '2'
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 2021-02-17
  • 2012-09-02
  • 1970-01-01
  • 2015-09-22
  • 2021-10-01
  • 2015-05-05
  • 2015-07-14
相关资源
最近更新 更多