为多个用户排名MySQL

问题描述 投票:0回答:2

我需要为我应该执行的任务提供帮助。我有一张桌子,其中包含以下字段:

  1. 用户名
  2. 分数
  3. 比赛

每个用户名可以多次出现在表中,因此他可以得到多个分数。无论如何,用户名只能与一个国家/地区关联。

下面是我的表格示例:

Username !! Country || Score
Bob       ! Italy   !   100
Bob       ! Italy   !   150
Christian ! Italy   !   500
Christian ! Italy   !   200
Fred      | Germany |  80
Carl      | Germany |  700
Charlie   | France  |   400
Charlie   | France  |  280
Jean      | France  |   90

[我将得到一个MYSQL命令,以仅考虑他的最高得分并舍弃其他得分来获得他所在国家/地区中每个用户的排名。

因此,我的理想输出应为:

基督教徒在意大利排名第一鲍勃在意大利排名第二卡尔在德国排名第一[]

弗雷德在德国排名第二]

查理在法国排名第一吉恩在法国排名第二[]

我可以订购用户并确定他们的等级,但要输入所有条目。我想拥有的只是分数最高的排名。

非常感谢您的帮助,

非常感谢

我需要为我应该执行的任务提供帮助。我有一个表格,其中包含以下字段:用户名得分竞争每个用户名可以多次出现在表格中,因此...

如果您正在运行MySQL 8.0,则可以使用聚合和窗口函数rank()进行此操作

select 
    username,
    country,
    max(score) top_score,
    rank() over(partition by country order by max(score) desc) country_rank
from mytable
group by username, country
order by country, country_rank

可以做到这一点的一种方法是:

SELECT o1.Username, o1.Country, o1.maxScore, 
    (SELECT COUNT(DISTINCT s2.Username) 
     FROM `scores` s2
     WHERE o1.Country = s2.Country AND s2.Score > o1.maxScore) + 1 AS ranking
FROM (
     SELECT Username, Country, MAX(Score) AS maxScore
     FROM `scores` s1
     GROUP BY Username) o1

此作者:

  • 第一次获得每个用户名的最高分数在别名“ o1”([MAX(Score) AS maxScore中看到
  • 第二项使用上面找到的maxScore结果和子查询“ s2”] >>来查找每个用户名和国家/地区的排名
  • 由于MAX(Score) AS maxScore是汇总结果,我们不能在1个查询中直接使用subQuery,但首先我们必须汇总结果并使用所得的最大分数。

mysql sql sql-order-by rows rank
2个回答
0
投票

如果您正在运行MySQL 8.0,则可以使用聚合和窗口函数rank()进行此操作


0
投票

可以做到这一点的一种方法是:

SELECT o1.Username, o1.Country, o1.maxScore, 
    (SELECT COUNT(DISTINCT s2.Username) 
     FROM `scores` s2
     WHERE o1.Country = s2.Country AND s2.Score > o1.maxScore) + 1 AS ranking
FROM (
     SELECT Username, Country, MAX(Score) AS maxScore
     FROM `scores` s1
     GROUP BY Username) o1
© www.soinside.com 2019 - 2024. All rights reserved.