[英]Rank users in mysql by their total points across multiple rows
我對此問題有非常相似的要求。
唯一的區別是我的數據。 上面的問題具有數據,其中表每個學生只有一行。 但在我的情況下,表格可能會像這樣為單個學生包含多行
所以,現在排名應根據計算SUM
點(總),其用戶。 因此,在這種情況下,結果將會是。
我嘗試了上述問題的解決方案,但沒有得到結果。 任何幫助,將不勝感激。
在我之前的答案中使用相同的查詢,只需將表格Student更改為子查詢即可合並每個學生的所有記錄
change [student er] for
(SELECT `id`, SUM(`points`) as `points`
FROM students
GROUP BY `id`) er
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 |
嘗試這個:
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
編輯:(這應該工作)
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位的兩個ID之后,您將獲得第6位,因為5個ID在第6位之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.