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 设置为 nulSET @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 求和多行和排名处理关系的主要内容,如果未能解决你的问题,请参考以下文章
MySql 01(安装,删除,简介,常用命令,简单查询,条件查询,排序,单行处理函数多行处理函数分组查询)
实时求和每次更改以及如何使用 ajax php mysql 处理它