【问题标题】:How to get the rank of a specific user with MySql如何使用 MySql 获取特定用户的排名
【发布时间】:2018-08-26 21:56:01
【问题描述】:

我将计算并获取列表中所有用户特定用户的排名,其中无重复排名。排名必须基于此:

order by progress_percent desc, gold_count desc

建议一个查询来实现这样的事情。

【问题讨论】:

  • 什么版本的 MySQL?
  • 6.3.6 是 MySQL Workbench 的版本,而不是数据库的版本。
  • @GordonLinoff 打败我。要获取数据库的版本,您可以使用 MySQL Workbench 在 Server Status 下检查您的服务器。或者您可以查询SELECT @@version;SELECT version()
  • @Shawn '10.1.34-MariaDB'

标签: mysql sql database mariadb


【解决方案1】:

当 MySQL 5x 完全被 MySQL8+ 取代并且 MySQL 中有真正的窗口函数时,我会很高兴。不过,在那一天之前,对于 MySQL 5x / MariaDB

SELECT username
  , progress_percent
  , gold_count
  , @uRank := @uRank + 1 AS theRank
FROM mytable t, ( SELECT @uRank := 0 ) r
ORDER BY progress_percent DESC, gold_count DESC, modify_date DESC

编辑:显然窗口函数直到 10.2 才添加到 MariaDB。 :-S

如果您使用的是 MySQL 8+ 或 MariaDB 10.2+,则可以只使用排名窗口函数:

SELECT username
  , progress_percent
  , gold_count
  , ROW_NUMBER() OVER (ORDER BY progress_percent DESC, gold_count DESC, modify_date DESC ) AS theRank
FROM mytable t
ORDER BY theRank

编辑 2:

对于特定用户,只需将上述查询放入子查询中,SELECT 就是你想要的Rank

SELECT s1.username, s1.progress_percent, s1.gold_count
FROM (
    [above query here]
) s1
WHERE s1.theRank = <theRankYouWant>

WHERE s1.username = <theUsernameYouWant>

【讨论】:

  • 如果我想为特定用户排名(第一种方法)怎么办?
  • 您需要将其包装在其他查询中,例如 SELECT * FROM ( one_off_the_qeuries ) alias WHERE username = &lt;username&gt; @MasoudDarvishian
  • @MasoudDarvishian 修改后的答案。
  • 您需要在 MySQL 8.0+ 查询中使用ROW_NUMBER() 而不是关闭RANK() 窗口函数。因为RANK() 将编号相同ROW_NUMBER() 不这样做.. 使用ROW_NUMBER() 将实现与 MySQL 的用户变量匹配,该变量的数量也不相同。
  • @RaymondNijland 你是对的。没有想。答案已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多