mysql 在总和和最佳分数上的排名

Posted

技术标签:

【中文标题】mysql 在总和和最佳分数上的排名【英文标题】:mysql ranking on sum and best score 【发布时间】:2017-07-22 14:44:34 【问题描述】:

我有一张这样结构的表:

score_id | user_id | category | subcategory | score
1        | 1       | game     | 0           | 100
2        | 1       | game     | 0           | 200
3        | 1       | quiz     | 0           | 2000
4        | 1       | quiz     | 1           | 1000
5        | 1       | game     | 0           | 10
6        | 1       | game     | 1           | 10
7        | 1       | game     | 2           | 100
8        | 1       | game     | 1           | 500
9        | 2       | game     | 0           | 600

我需要不同的查询mysql

1) 按 user_id 分组的所有团队排名,所有用户记录中所有类别和子类别的所有最佳结果之和

预期结果

user_id | total_score | ranking
1       | 3310        | 1
2       | 600         | 2

在哪里

3310 = (200 + 10 + 100+1000+2000) 
 200 is the best result of game 0, 
 10 is the best result of game 1, 
 100 is the best result of game 2, 
 2000 is the best result of quiz 0
 1000 is the best result of quiz 1

600 = (600)
 600 is the best result of game 0, 

@Strawberry 的解决方案(谢谢)

SELECT a.*
     , @i:=@i+1 rank
  FROM 
     ( SELECT user_id
            , SUM(subtotal) total 
         FROM 
           ( SELECT user_id
                   , category
                   , subcategory
                   , MAX(score) subtotal 
                FROM my_table 
               GROUP 
                  BY user_id
                   , category
                   , subcategory
            ) x 
        GROUP 
           BY user_id
     ) a
  JOIN 
     ( SELECT @i:=0) vars
 ORDER
    BY total DESC;

2) 按 user_id 分组的所有团队的排名

预期结果游戏

user_id | total_score | ranking
2       | 600         | 1
1       | 310         | 2

在哪里

600 = (600)
 600 is the best result of game 0, 

310 = (200 + 10 + 100) 
 200 is the best result of game 0, 
 10 is the best result of game 1, 
 100 is the best result of game 2,

预期结果测验

user_id | total_score | ranking
1       | 3000       | 1
2       | 0          | 2

在哪里

3000 = (200 + 10 + 100) 
 2000 is the best result of quiz 0
 1000 is the best result of quiz 1

 0= (0)
(user_id= 2 don't play quiz)

基于@Strawberry 的解决方案(谢谢)

SELECT a.*
     , @i:=@i+1 rank
  FROM 
     ( SELECT user_id
            , SUM(subtotal) total 
         FROM 
           ( SELECT user_id
                   , category
                   , subcategory
                   , MAX(score) subtotal 
                FROM my_table
                WHERE category = 'game' // or 'quiz
               GROUP 
                  BY user_id
                   , category
                   , subcategory
            ) x 
        GROUP 
           BY user_id
     ) a
  JOIN 
     ( SELECT @i:=0) vars
 ORDER
    BY total DESC;

3) 按 user_id 分组的所有团队的排名

预期结果游戏0

user_id | total_score | ranking
2       | 600         | 1
1       | 310         | 2

在哪里

600 = (600)
 600 is the best result of game 0, 

200 = (200 ) 
 200 is the best result of game 0, 

基于@Strawberry 的解决方案(谢谢)

SELECT a.*
     , @i:=@i+1 rank
  FROM 
     ( SELECT user_id
            , SUM(subtotal) total 
         FROM 
           ( SELECT user_id
                   , category
                   , subcategory
                   , MAX(score) subtotal 
                FROM my_table
                WHERE category = 'game'
                AND subcategory = '0'
               GROUP 
                  BY user_id
                   , category
                   , subcategory
            ) x 
        GROUP 
           BY user_id
     ) a
  JOIN 
     ( SELECT @i:=0) vars
 ORDER
    BY total DESC;

4) 获取查询 1 的单个用户 (ex user_id=1 ) 的总分

5) 获取查询 1 的单个用户(例如 user_id=1 )的排名

6) 获取查询 2 的单个用户 (ex user_id=1 ) 的总分

7) 获取查询 2 的单个用户(例如 user_id=1 )的排名

8) 获取查询 3 的单个用户 (ex user_id=1 ) 的总分

9) 获取查询 3 的单个用户(例如 user_id=1 )的排名

谢谢!

【问题讨论】:

您已经尝试过完成所有这些,或者您只是希望有人为您编写? 正如所写,我认为这个问题太宽泛了。我建议您删除此问题并就其中一个主题提出另一个问题。 @pierregrander ,我需要一个提示,我找到了获得最佳价值的解决方案,无需总和 @gordonlinoff 我也这么认为,但也许一个查询可能与另一个查询相关......所以我决定将所有内容分组。 Offcourse 非常感谢任何部分帮助:) "1) 按 user_id 分组的所有团队的排名,所有用户记录在类别和子类别中的所有最佳结果之和" 这无法理解。 【参考方案1】:

这是第一个。使用它,向我们展示你在剩下的时间里的最大努力......

SELECT a.*
     , @i:=@i+1 rank
  FROM 
     ( SELECT user_id
            , SUM(subtotal) total 
         FROM 
            ( SELECT user_id
                   , category
                   , subcategory
                   , MAX(score) subtotal 
                FROM my_table 
               GROUP 
                  BY user_id
                   , category
                   , subcategory
            ) x 
        GROUP 
           BY user_id
     ) a
  JOIN 
     ( SELECT @i:=0) vars
 ORDER
    BY total DESC;

请注意,此解决方案不考虑平局。

【讨论】:

它有效,谢谢!我只是编辑获取点 2 和 3 的 where 条件

以上是关于mysql 在总和和最佳分数上的排名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 基于得分和时间的排名

MySQL分数排名

MySQL分数排名

MYSQL分数排名

mysql中的用户按他们的分数排名

mysql--分数排名