我有非常类似的要求,如本问题所述。
唯一的区别是我的数据。以上问题的数据中,每个学生只有一行表。但在我的例子中,可能存在这样一种可能性,即表包含这样的单个学生的多行
因此,现在的排名应该根据用户拥有的点数(总计)的SUM来计算。所以在这种情况下,结果将是。
用于数据
我试了几件事,解决了上面的问题,但没有得到结果。任何帮助都将不胜感激。
发布于 2016-01-08 19:06:39
在前面的答案中使用相同的查询,只需更改子查询的表学生,以组合每个学生的所有记录。
change [student er] for
(SELECT `id`, SUM(`points`) as `points`
FROM students
GROUP BY `id`) erSQL演示
select er.*,
(@rank := if(@points = points,
@rank,
if(@points := points,
@rank + 1,
@rank + 1
)
)
) as ranking
from (SELECT `id`, SUM(`points`) as `points`
FROM students
GROUP BY `id`) er cross join
(select @rank := 0, @points := -1) params
order by points desc;输出
| id | points | ranking |
|----|--------|---------|
| 5 | 91 | 1 |
| 6 | 81 | 2 |
| 1 | 80 | 3 |
| 2 | 78 | 4 |
| 3 | 78 | 4 |
| 4 | 77 | 5 |
| 7 | 66 | 6 |
| 8 | 15 | 7 |发布于 2016-01-08 17:07:56
试试这个:
select id, points, @row := ifnull(@row, 0) + diff rank
from (select *, ifnull(@prev, 0) != points diff, @prev := points
from (select id, sum(points) points
from students
group by 1
order by 2 desc) x) y请参阅SQLFiddle
发布于 2016-01-08 17:21:11
编辑:(这应该有效)
SELECT I.Id, I.Points, Rk.Rank
FROM
(SELECT Id, Points, @Rk := @Rk+1 As Rank
FROM (SELECT id, SUM(points) AS Points
FROM students
GROUP BY id
ORDER BY Points DESC) As T,
(SELECT @Rk := 0) AS Rk) As I
INNER JOIN
(SELECT *
FROM (
SELECT Id, Points, @Rk2 := @Rk2+1 As Rank
FROM (SELECT id, SUM(points) AS Points
FROM students
GROUP BY id
ORDER BY Points DESC) As T1,
(SELECT @Rk2 := 0) AS Rk) AS T2
GROUP BY Points) As Rk
USING(Points)产出如下:
| Id | Points | Rank |
|----|--------|---------|
| 5 | 91 | 1 |
| 6 | 81 | 2 |
| 1 | 80 | 3 |
| 2 | 78 | 4 |
| 3 | 78 | 4 |
| 4 | 77 | 6 |
| 7 | 66 | 7 |
| 8 | 15 | 8 |在第4位的两个in之后,您将得到第6位,因为5个in位于第6位之前。
https://stackoverflow.com/questions/34682333
复制相似问题