mySQL 求和多行和排名处理关系

Posted

技术标签:

【中文标题】mySQL 求和多行和排名处理关系【英文标题】:mySQL sum multiple rows and rank handling ties 【发布时间】:2011-04-29 21:09:20 【问题描述】:

我有下表:

  userid  compid round score    bonus
  2980    3     0     50          0
  50        3     0     80          0
  52        3     0     80          0
  55        3     0     20          0
  58        3     0     100         0
  106      3     0     120         0
  555      3     0     50          0
  100     3     0     30          0
  50        3     1     90          0
  52        3     1     50          0
  106      3     1     30          0

我希望不仅能够对每个用户在所有回合中的得分和奖金列进行求和,而且还能够对它们进行相应的排名。它应该能够处理与序列 1,2,2,4,5,5,5,8 的关系:

诀窍是我不想创建临时表或将排名插入表中。此外,我不能限制回报 - 所以它需要对整个表进行排名,无论是否完成了回合。

我已设法对行进行排名,但似乎无法将它们与总和分组。当然,我已经分别管理了总和 - 我只需要“加入”这两个步骤。

获取每个用户的总和:

SELECT userid,sum(score+bonus) as tscore from entries 
group by userid order by tscore desc

userid  tscore
50      170
106    150
52      130
58      100
2980      50
555    50
100    30
55        20

没有得分总和的排名:(感谢 mysql Cookbook)

SELECT @rownum := @rownum + 1 AS row,
@rank := IF(@prev_val!=score,@rownum,@rank) AS rank,
userid,
@prev_val := score AS score
FROM exodus_entries ORDER BY score DESC

row   rank  userid      score
1      1    106         120
2      2    58          100
3      3    50          90
4      4    50          80
5      4    52          80
6      6    52          50
7      6    555         50
8      6    2980        50
9      9    100         30
10    9     106         30
11    11    55          20

感谢您的时间和帮助!欢迎所有建议!

【问题讨论】:

【参考方案1】:
SELECT @rownum := @rownum + 1 AS row,
    @rank := IF(@prev_val!=score,@rownum,@rank) AS rank,
    userid,
    @prev_val := score AS score
FROM (
    SELECT userid, sum(score+bonus) as score 
    from entries 
    group by userid 
) exodus_entries 
ORDER BY score DESC

【讨论】:

谢谢Kakao!!奇迹般有效。只是想补充一下,如果您使用与上面完全相同的代码,您将在您的字段中看到 [BLOB - 0B],不要忘记将 vars 设置为 nul SET @rownum = 0, @rank = 0, @prev_val = NULL; 找到了这个答案:一个注释 - 我必须添加行 'set @rownum=0;设置@rank=0;' (不带单引号)在第一行之前让它工作 - 否则不会计算 rownum 和 rank。【参考方案2】:

我有同样的问题,我执行了 SET @rownum = 0, @rank = 1, @prev_val = NULL;

在运行以下代码之前:

SELECT @rownum := @rownum + 1 AS row,
@rank := IF(@prev_val!=total_number,@rownum,@rank) AS rank,
your_column,
@prev_val := total_number AS total_number
FROM your_table ORDER BY total_number DESC;

【讨论】:

【参考方案3】:

我认为这应该可以解决问题:

SELECT userid,round, sum(score+bonus) as tscore from entries 
group by userid, round order by tscore desc

虽然没有测试。

【讨论】:

嗨,Arjan,谢谢 - 但这不起作用:圆形显示为 0、0、1、0、0、1,而且它也不是每个用户的总和。 我猜我误读了这个问题,每个用户只需要一行。您可以使用 php(或您使用的任何其他语言)来确定排名和行号,但我认为这可能不是最好的解决方案。 没有问题 - Kakao 设法帮助我使用纯 SQL 将其连接在一起。感谢您的帮助。

以上是关于mySQL 求和多行和排名处理关系的主要内容,如果未能解决你的问题,请参考以下文章

vb+sql 求和值为null时怎么处理?

MySql 01(安装,删除,简介,常用命令,简单查询,条件查询,排序,单行处理函数多行处理函数分组查询)

实时求和每次更改以及如何使用 ajax php mysql 处理它

Mysql数据处理/行转列/列转行/分割/拼接/数据复制汇总

如何对按客户分组的多列和多行求和

Myslq基础知识