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 在总和和最佳分数上的排名的主要内容,如果未能解决你的问题,请参考以下文章